打印
[STM32]

STM32模拟iic 主机 atmega8l iic从机

[复制链接]
4093|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
z755924843|  楼主 | 2014-1-2 17:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 z755924843 于 2014-1-3 13:32 编辑

第一次使用IIC ,看网上都说32的硬件IIC 有bug所以使用软件模拟IIC,STM32 作为主机,atmega8作为从机,主机模拟的程序是移植的原子的程序,
写操作没有问题,atmega8 都能接到正确的数据,但是读操作压根就读不到数据偶尔可以读到数据也是错误的。
下面是我的程序,希望坛子里的大神们给点思路。小弟在此谢过
void IIC_WriteOneByte(u8 val)
{                                                                                                                                                                                          
   IIC_Start();  
   IIC_Send_Byte(0x56<<1);   //发送从机地址0X56,写数据         
   IIC_Wait_Ack();           
   IIC_Send_Byte(0x81);   //发送内部地址
   IIC_Wait_Ack();                                                                                                               
   IIC_Send_Byte(val);     //发送字节                                                            
   IIC_Wait_Ack();                                 
   IIC_Stop();//产生一个停止条件
   delay_ms(10);         
}
写函数没有问题,有问题的是下面读数据的函数。
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{                                 
        u8 temp=0;                                                                                                                                                               
        u8 i;
   IIC_Start();  
   IIC_Send_Byte(0x56<<1);   //发送器件地址0XA0,写数据            
   IIC_Wait_Ack();
   IIC_Send_Byte(0x55);   //发送低地址
   IIC_Wait_Ack();            
   delay_us(10);
   IIC_Start();  
   IIC_Send_Byte((0x56<<1)+1);           //进入接收模式                           
   IIC_Wait_Ack();         
   temp=IIC_Read_Byte(0);                   //但是读不到正确数
   IIC_Stop();//产生一个停止条件
   return temp;
}
能读到数据但是不正确。有没有人做过帮帮忙,看一下。

刚刚调试了一下发现在用在读m8的时候 m8已经把数据放入到TWDR中了 可是stm32 这边接收到却是全0

相关帖子

沙发
NE5532| | 2014-1-2 17:08 | 只看该作者
有没有BUG,以厂家的勘误表为准,不应该道听途说,而且STM32已经用了很久了,不会有“完全不能用”这么低级的错误出现。

STM32做软I2C不合算,因为内核太快了,I2C总线太慢了,浪费了N多时间。实在要做,既然两边都是MCU,建议在AVR那边打断点,看读过程进行到什么地方出错的。

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
z755924843 + 3 赞一个!
板凳
z755924843|  楼主 | 2014-1-2 17:42 | 只看该作者
NE5532 发表于 2014-1-2 17:08
有没有BUG,以厂家的勘误表为准,不应该道听途说,而且STM32已经用了很久了,不会有“完全不能用”这么低级 ...

哦,我之前一直在调试32这边,因为avr那边的程序的是原封不动的移植过来的只是多加了几个LED,所以一直也没怀疑是avr的问题,我试试看在avr这边调试看看,谢谢版主。

使用特权

评论回复
地板
lirunze| | 2014-1-2 19:19 | 只看该作者
STM32的IIC的确是很不好用的啊
我是实际使用过的啊

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
z755924843 + 2
5
airwill| | 2014-1-2 21:13 | 只看该作者
不知道这个 IIC_Read_Byte(0);                   是怎么实现的?
这是库函数吗? 我查了一下库函数, 里面的函数都是 I2C_ 打头的.
关键点是, 在返回之前, 有没有判断是否已经收到数据了?

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
z755924843 + 3
6
ayb_ice| | 2014-1-3 08:30 | 只看该作者
这样的驱动哪有什么可靠可言,一个返回值判断都没有,完全直线运行,不管结果怎样

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
z755924843 + 3
7
z755924843|  楼主 | 2014-1-3 10:33 | 只看该作者
airwill 发表于 2014-1-2 21:13
不知道这个 IIC_Read_Byte(0);                   是怎么实现的?
这是库函数吗? 我查了一下库函数, 里面的 ...

我用的是原子的给的库函数 ,他们的例程就是模拟的,我直接移植过来的
u8 IIC_Read_Byte(unsigned char ack)
{
        unsigned char i,receive=0;
        SDA_IN();//SDA设置为输入
    for(i=0;i<8;i++ )
        {
                delay_us(DELAY_TIME);
        IIC_SCL=0;
        delay_us(DELAY_TIME);
                IIC_SCL=1;
                delay_us(DELAY_TIME);
        receive<<=1;
        if(READ_SDA)receive+=1;   
                delay_us(DELAY_TIME);
    }                                         
    if (!ack)
        IIC_NAck();//发送nACK
    else
        IIC_Ack(); //发送ACK   
    return receive;
}
我怀疑是延时的问题,因为之前用51作为主机的时候每次延时大概100us左右,但是我用正点原子的程序的延时都是4us,还有就是 怎么判断是否接收到啊?等待ack不就是等待回应吗?假如回应了 就表示数据已经返回了吗?还是说我的理解有问题?

使用特权

评论回复
8
z755924843|  楼主 | 2014-1-3 10:34 | 只看该作者
ayb_ice 发表于 2014-1-3 08:30
这样的驱动哪有什么可靠可言,一个返回值判断都没有,完全直线运行,不管结果怎样 ...

从机返回ack不就是返回了吗?不知道用什么方法判断返回值啊,新手 求给点意见。谢谢了

使用特权

评论回复
9
z755924843|  楼主 | 2014-1-3 10:36 | 只看该作者
lirunze 发表于 2014-1-2 19:19
STM32的IIC的确是很不好用的啊
我是实际使用过的啊

我也没用过 ,这是第一次用 ,就是看网上好多人都说所以就没敢用,二是因为他的iic寄存器不好弄 看手册都给我看蒙了。

使用特权

评论回复
10
lirunze| | 2014-1-3 12:19 | 只看该作者
z755924843 发表于 2014-1-3 10:36
我也没用过 ,这是第一次用 ,就是看网上好多人都说所以就没敢用,二是因为他的iic寄存器不好弄 看手册都 ...

恩,最好是模拟时序来做啊

使用特权

评论回复
11
yyjasen| | 2014-1-3 14:07 | 只看该作者
一般都是时序上的问题

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
z755924843 + 1
12
z755924843|  楼主 | 2014-1-3 14:57 | 只看该作者
找到问题了 ,原来是挂在总线上的24c02对总线有影响,向m8写操作的时候由于不需要返回数据所以没有问题,但是当读操作的时候,虽然没有读取24c02的地址,但是由于24c02仍然使能,对i2c总线干扰,导致被寻址的m8不能正常返回数据(用示波器观察电平不对)

使用特权

评论回复
13
z755924843|  楼主 | 2014-1-3 14:57 | 只看该作者
yyjasen 发表于 2014-1-3 14:07
一般都是时序上的问题

挂在总线上的24c02对iic有干扰。

使用特权

评论回复
14
那一抹明媚| | 2014-4-10 19:26 | 只看该作者
可以完成写操作了!!!???  我现在正在搞这个 失败了 很着急  楼主能不能帮帮忙!!!跪谢

使用特权

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

本版积分规则

个人签名:嵌入式相关网站喜欢的朋友了解一下http://www.micropython.group

31

主题

260

帖子

39

粉丝