风-417456 发表于 2014-7-10 10:30:50

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。

发表于 2014-7-10 15:10:15

RE:STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。

你的频率配置的多少?建议用100-400Khz的频率。

风-417456 发表于 2014-7-10 15:17:22

回复:STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。

回复第 2 楼 于2014-07-10 15:10:15发表:
你的频率配置的多少?建议用100-400Khz的频率。
100KHz的
 

发表于 2014-7-10 16:36:25

RE:STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。

用示波器测试一下,I2C是否回复了ACK。单步和连续的时候都测试一下。

发表于 2014-7-10 16:43:23

RE:STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。

0x0f,这个应该是7Mhz的频率。8M是0x08

风-417456 发表于 2014-7-10 22:40:08

回复:STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。

回复第 5 楼 于2014-07-10 16:43:23发表:
0x0f,这个应该是7Mhz的频率。8M是0x08
 
就是用示波器观察的,单步执行发送地址后能获取应答信号,连续运行就会出错,无应答。8MHz是0x0f,如果是8的话那是用10进制表示的时候。
 

发表于 2014-7-11 09:26:15

RE:STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。

还是频率的问题,我可能算错了。0f应该是15M的频率。8M是0x08。这个楼主可以再看看手册。

风-417456 发表于 2014-7-11 09:52:24

回复:STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。

回复第 7 楼 于2014-07-11 09:26:15发表:
还是频率的问题,我可能算错了。0f应该是15M的频率。8M是0x08。这个楼主可以再看看手册。
 
 
 
是我算错了,8MHz是0x08。晚上回家我再测试效果。
 

发表于 2014-7-11 09:53:43

RE:STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。

看现象应该是频率太高引起的不匹配。

风-417456 发表于 2014-7-11 10:11:35

回复: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
查看完整版本: STM8 I2C硬件连续运行情况下接收数据时发送地址后接收不到应答信号。