打印
[STM8]

STM8S两个单片机I2C通信 I2C主机发了地址 从机没返回ACK

[复制链接]
9122|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
421477036|  楼主 | 2014-10-10 10:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
直接参考了网上的程序
主机发送数据,从机接受数据。
主机发送了地址,从机没返回ACK。现象主机卡”while(!(I2C_SR1&0x02))“。从机进不了中断,初始化设置了ACK,可是查看寄存器地址没写入,大侠们看看,什么问题。

主机程序
void I2C_init(void)
{
        I2C_FREQR = 0x0a;  
        I2C_CCRH = 0x00;  
        I2C_CCRL = 0x32;  
        I2C_TRISER = 0x04;  
        I2C_CR2 |=0x04;  
        I2C_CR1 |=0x01;
}
void zhu_w(uchar x )
{
        uchar temp;
        while(I2C_SR3 & 0x02); //总线空闲
        I2C_CR2 |= 0x01; //产生起始位
        while(!(I2C_SR1 & 0x01)); //起始位发送完成
        I2C_DR = 0x42; //从机地址
        while(!(I2C_SR1&0x02));//地址发送完成
        temp = I2C_SR1;
        temp = I2C_SR3;
        I2C_DR = 0x00;
        while(!(I2C_SR1 & 0x84));  
        I2C_DR = x;
        while(!(I2C_SR1 & 0x84));
        I2C_CR2 |= 0x02;
}

从机程序
@far @interrupt void I2C_Handler(void)
{
uchar state1,state2,state3;

//地址匹配 地址位1
if((I2C_SR1&0x02)==0x02)
{

state1 = I2C_SR1;
state3 = I2C_SR3;
I2C_CR2 |= 0x04;
}
        //接收到数据
if( (I2C_SR1& 0x40) ==0x40)
     {
     I2C_CR2  |= 0x04;
     con  = I2C_DR;
//SetOutput(temp1);
     }

if((I2C_SR2 & 0x04) == 0x04)
I2C_SR2 &= ~0x04; //应答失败,清除该位

if((I2C_SR1 & 0x10) == 0x10)
{
  state1 = I2C_SR1;
  I2C_CR2 |= 0x02;
}
}
void I2C_init(void)
{
        I2C_FREQR = 0x0a;  
        I2C_CCRH = 0x00;  
        I2C_CCRL = 0x32;  
        I2C_TRISER = 0x04;
        I2C_OARH=0x40;
        I2C_OARL=0x42;
        I2C_ITR |= 0x06;//中断使能       
        I2C_CR2 =0x04;  //应答设置
        I2C_CR1 |=0x01; //使能I2C模块

}

沙发
421477036|  楼主 | 2014-10-10 13:10 | 只看该作者
顶一个,大家提个建议。

使用特权

评论回复
板凳
mmuuss586| | 2014-10-10 18:52 | 只看该作者
是不是从机响应不及时;
从机主要在干啥???

上面的程序是主机的吧?

使用特权

评论回复
地板
airwill| | 2014-10-10 20:20 | 只看该作者
象楼主这种方式的主从机一起调试程序会比较吃力. 因为定位问题比较复杂.
推荐一端一端的分开的方式, 可以先用个 I2C 从器件 (如 EEPROM) 先调试好了底层的主机软件, 再调试从机程序.
好象烦一点, 但不需要两个程序相互纠结.

使用特权

评论回复
5
421477036|  楼主 | 2014-10-11 08:27 | 只看该作者
mmuuss586 发表于 2014-10-10 18:52
是不是从机响应不及时;
从机主要在干啥???

我从机没做其他,就一个I2C中断,等着主机的信号的。
前面部分是主机的,后半部分从机的。很痛苦的,就是找不到问题的呢

使用特权

评论回复
6
421477036|  楼主 | 2014-10-11 08:30 | 只看该作者
airwill 发表于 2014-10-10 20:20
象楼主这种方式的主从机一起调试程序会比较吃力. 因为定位问题比较复杂.
推荐一端一端的分开的方式, 可以先 ...

恩,我就是两个程序在纠结的,我加个EEPROM先试试的。

使用特权

评论回复
7
421477036|  楼主 | 2014-10-11 15:43 | 只看该作者
airwill 发表于 2014-10-10 20:20
象楼主这种方式的主从机一起调试程序会比较吃力. 因为定位问题比较复杂.
推荐一端一端的分开的方式, 可以先 ...

我单片机跟eeprom程序可以了,说明我的主机写操作没问题的,从机部分还是有问题的,还是没有ACK,能再给个建议吗,谢谢的。

使用特权

评论回复
8
421477036|  楼主 | 2014-10-11 15:46 | 只看该作者
我单片机跟eeprom24c02程序OK,说明主机写操作没问题的。从机还是有问题的,没有ACK的,大侠们,从机你们都是怎么写的呢,给建议,或者给个程序,参考下的,谢谢的。

使用特权

评论回复
9
airwill| | 2014-10-11 18:47 | 只看该作者
用调试器:看有没有接收中断,看从机地址设置有没有问题。

使用特权

评论回复
10
421477036|  楼主 | 2014-10-13 09:14 | 只看该作者
airwill 发表于 2014-10-11 18:47
用调试器:看有没有接收中断,看从机地址设置有没有问题。

什么调试器的。用仿真软件的,看各个寄存器设置是没问题的,就是不知道问题的,真让这个给高蒙。

使用特权

评论回复
11
pofu007| | 2014-10-13 09:33 | 只看该作者
我猜测这个情况是不是i2c器件地址搞错了
看了下I2C_OARL  
位7:1 ADD [7:1]:接口地址
地址的7:1 位
位0;
ADD0: 接口地址
7位地址模式:此位不用关心
10位地址模式:地址的位0

所以从器件的地址0x42,是不是应该写成I2C_OARL = 0x42 << 1;

使用特权

评论回复
12
421477036|  楼主 | 2014-10-13 09:44 | 只看该作者
pofu007 发表于 2014-10-13 09:33
我猜测这个情况是不是i2c器件地址搞错了
看了下I2C_OARL  
位7:1 ADD [7:1]:接口地址

我改了地址,还是不行的,中断服务程序还是进不去,再看看程序,还其他有问题吗,辛苦辛苦的

使用特权

评论回复
13
421477036|  楼主 | 2014-10-13 15:14 | 只看该作者
感谢airwill,mmuuss586 ,pofu007大侠建议、帮助的。我问题解决了。
从机程序中的,检测到停止 应该把I2C_CR2 |= 0x02;改为I2C_CR2 |= 0x04;
还有之前我都连接着烧写器在软件上仿真,不连接直接在示波器上看效果的,就可以的。这个不懂为什么的。

使用特权

评论回复
14
qgmfly| | 2015-8-13 18:59 | 只看该作者
您好,我是STM8S单片机初学者,最近想弄一下两块单片机之间的I2C通信,在论坛上看到您发的贴,想请教一下能否将两个STM8S之间的I2C通信共享一下,感激不尽。邮箱:qgmfly@foxmail.com

使用特权

评论回复
15
逝去那天| | 2015-12-15 20:06 | 只看该作者
qgmfly 发表于 2015-8-13 18:59
您好,我是STM8S单片机初学者,最近想弄一下两块单片机之间的I2C通信,在论坛上看到您发的贴,想请教一下能 ...

你的IIC通了吗?两块单片机。

使用特权

评论回复
16
qq00568| | 2016-6-21 23:17 | 只看该作者
调通了吗,借鉴下,qq663883753

使用特权

评论回复
评论
18814303937 2019-3-11 11:37 回复TA
是否有群主的源码呀,有的话借鉴一下哈 qq 623142752 
17
mintspring| | 2017-7-19 21:52 | 只看该作者
这个确实棘手。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

18

帖子

0

粉丝