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

查看: 12768|回复: 17

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

[复制链接]

7

主题

22

回帖

0

蝴蝶豆

初级会员

最后登录
2019-8-3
发表于 2014-7-10 10:30:50 | 显示全部楼层 |阅读模式
 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。
回复

使用道具 举报

134

主题

4489

回帖

239

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2014-7-10 15:10:15 | 显示全部楼层

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

你的频率配置的多少?建议用100-400Khz的频率。
回复 支持 反对

使用道具 举报

7

主题

22

回帖

0

蝴蝶豆

初级会员

最后登录
2019-8-3
 楼主| 发表于 2014-7-10 15:17:22 | 显示全部楼层

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

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

使用道具 举报

134

主题

4489

回帖

239

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2014-7-10 16:36:25 | 显示全部楼层

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

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

使用道具 举报

134

主题

4489

回帖

239

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2014-7-10 16:43:23 | 显示全部楼层

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

0x0f,这个应该是7Mhz的频率。8M是0x08
回复 支持 反对

使用道具 举报

7

主题

22

回帖

0

蝴蝶豆

初级会员

最后登录
2019-8-3
 楼主| 发表于 2014-7-10 22:40:08 | 显示全部楼层

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

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

使用道具 举报

134

主题

4489

回帖

239

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2014-7-11 09:26:15 | 显示全部楼层

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

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

使用道具 举报

7

主题

22

回帖

0

蝴蝶豆

初级会员

最后登录
2019-8-3
 楼主| 发表于 2014-7-11 09:52:24 | 显示全部楼层

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

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

使用道具 举报

134

主题

4489

回帖

239

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2014-7-11 09:53:43 | 显示全部楼层

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

看现象应该是频率太高引起的不匹配。
回复 支持 反对

使用道具 举报

7

主题

22

回帖

0

蝴蝶豆

初级会员

最后登录
2019-8-3
 楼主| 发表于 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
回复 支持 反对

使用道具 举报

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版