STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。
void I2C_Init(void){
I2C_close();
I2C_Ack();
I2C_FREQR=0x0f; //I2C外设时钟频率为8MHz
I2C_CCRH=0x00; //
I2C_CCRL=0x28;
I2C_TRISER=0x11;
I2C_open();
}
void I2C_Write(unsigned char highbyte_add, unsigned char lowbyte_add, unsigned char data)
{
unsigned char temp;
I2C_start();
while(!I2C_SBask);
I2C_writebyte(Write_add);
while(!I2C_addrask);
temp=I2C_SR1;
temp=I2C_SR3;
I2C_writebyte(highbyte_add);
while(!I2C_TxEask);
I2C_writebyte(lowbyte_add);
while(!I2C_TxEask);
I2C_writebyte(data);
while(!I2C_TxEask);
I2C_stop();
}
unsigned char I2C_Read(unsigned char highbyte_add,unsigned char lowbyte_add)
{
unsigned char temp;
I2C_start();
while(!I2C_SBask);
I2C_writebyte(Write_add);
while(!I2C_addrask); 连续运行时总会卡在这一步,用示波器观察是没有收到应答信号。但是一步一步仿真测试的话是能接收 到应答信号的。在写数据到EEPROM的操作中不会出现这样的问题。
temp=I2C_SR3;
I2C_writebyte(highbyte_add);
while(!I2C_TxEask);
temp=I2C_SR3;
I2C_writebyte(lowbyte_add);
while(!I2C_TxEask);
I2C_start();
while(!I2C_SBask);
I2C_writebyte(Read_add);
while(!I2C_addrask);
temp=I2C_SR3;
while(!I2C_RxNeask);
temp=I2C_DR;
return temp;
I2C_NAck();
I2C_stop();
}
哪位知道原因?我操作的是24C256。
RE:STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。
你的频率配置的多少?建议用100-400Khz的频率。回复:STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。
回复第 2 楼 于2014-07-10 15:10:15发表:你的频率配置的多少?建议用100-400Khz的频率。
100KHz的
RE:STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。
用示波器测试一下,I2C是否回复了ACK。单步和连续的时候都测试一下。RE:STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。
0x0f,这个应该是7Mhz的频率。8M是0x08回复:STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。
回复第 5 楼 于2014-07-10 16:43:23发表:0x0f,这个应该是7Mhz的频率。8M是0x08
就是用示波器观察的,单步执行发送地址后能获取应答信号,连续运行就会出错,无应答。8MHz是0x0f,如果是8的话那是用10进制表示的时候。
RE:STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。
还是频率的问题,我可能算错了。0f应该是15M的频率。8M是0x08。这个楼主可以再看看手册。回复:STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。
回复第 7 楼 于2014-07-11 09:26:15发表:还是频率的问题,我可能算错了。0f应该是15M的频率。8M是0x08。这个楼主可以再看看手册。
是我算错了,8MHz是0x08。晚上回家我再测试效果。
RE:STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。
看现象应该是频率太高引起的不匹配。回复:STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。
回复第 9 楼 于2014-07-11 09:53:43发表:看现象应该是频率太高引起的不匹配。
刚看了一下,我系统时钟设置的就是8M,能提供给I2C接口的最高频率应该也只有8M吧?我刚看了之前测试拍的照片看时钟线频率确实是100KHz。我把照片也传一下。
这张是无应答的
这张是有应答的
最后这张是昨天晚上调试发现的问题,很奇怪。下面是读数据里接收数据的有端程序。
I2C_writebyte(Read_add);
while(!I2C_addrask);
temp=I2C_SR3; 在执行完这条后I2C_DR里确实正确的读取了24C256里面的内容
temp=I2C_DR; 但一执行读取I2C_DR里的数据这条后I2C_DR里的数据就全部制1,变成0xff,temp接收到的数据也就成0xff了。
页:
[1]
2