你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
风-417456 提问时间:2014-7-10 10:30 /
 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。
收藏 评论17 发布时间:2014-7-10 10:30

举报

17个回答
废鱼 回答时间: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。我把照片也传一下。
这张是无应答的
无应答.JPG
这张是有应答的
应答.JPG
 
最后这张是昨天晚上调试发现的问题,很奇怪。下面是读数据里接收数据的有端程序。
        I2C_writebyte(Read_add);
        while(!I2C_addrask);
        temp=I2C_SR3;   在执行完这条后I2C_DR里确实正确的读取了24C256里面的内容
        temp=I2C_DR;     但一执行读取I2C_DR里的数据这条后I2C_DR里的数据就全部制1,变成0xff,temp接收到的数据也就成0xff了。
接收后.JPG
废鱼 回答时间:2014-7-11 10:21:37

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

示波器显示的频率是8Mhz,根据寄存器的值算,可能是超范围了。现在单步可以读取,程序是对的,如果用中断的方式是不是也会出这样的问题呢?
风-417456 回答时间:2014-7-11 10:23:14

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

回复第 11 楼 于2014-07-11 10:21:37发表:
示波器显示的频率是8Mhz,根据寄存器的值算,可能是超范围了。现在单步可以读取,程序是对的,如果用中断的方式是不是也会出这样的问题呢?
 
 
 
我用的查询法,还没有用中断试过。
 
废鱼 回答时间:2014-7-11 16:11:57

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

我没用过STM8,其他的I2C都是类似的。但我不知道你读取SR3干什么用的,手册上写的是要清除ADDR时读取SR3。
有缘于你 回答时间:2014-7-12 08:38:51

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

前一个stop发出去了么, 还有读之前是在写入么,写入需要等一段时间24C256才会有应答的, 程序应该改改, 不能这样写,很容易死机的,应该用超时判断, 错误恢复等容错能力
风-417456 回答时间:2014-7-12 12:26:09

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

回复第 13 楼 于2014-07-11 16:11:57发表:
我没用过STM8,其他的I2C都是类似的。但我不知道你读取SR3干什么用的,手册上写的是要清除ADDR时读取SR3。
搞定了,I2C写数据和读数据的操作之间没有延时,延时10ms以上就能读写了,20ms以上的话时序比较稳定。
 
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版