OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12723|回复: 3

请教 stm32的i2c接收问题

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2012-10-11
在线时间
0 小时
发表于 2012-10-11 19:32:14 | 显示全部楼层 |阅读模式
            
这里我不懂的就是红色注释的地方,希望大家给解答下,先谢谢了。 另外每个while()是不是相当于完成ACK应答。i2c是说每次发送一字节数据就得完成一次ACK,这是完成这个功能么?

void I2C_ReadS_24C(u8 addr ,u8* pBuffer,u16 no)
{
    if(no==0)        return;
        
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));                 // 这里判断总线忙闲                
        /*允许1字节1应答模式*/
I2C_AcknowledgeConfig(I2C1, ENABLE);
        /* 发送起始位 */
I2C_GenerateSTART(I2C1, ENABLE);    // 发送起始标志位
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*/  

#ifdef AT24C01A        
    /*发送器件地址(写)*/
    I2C_Send7bitAddress(I2C1,  EEPROM_ADDR, I2C_Direction_Transmitter);           //这里主机发送Epprom的地址
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));        //

        /*发送地址*/
        I2C_SendData(I2C1, addr);                                  //这里发送Epprom内部寄存器地址
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));/*数据已发送*/
                
        /*起始位*/
        I2C_GenerateSTART(I2C1, ENABLE);          //发送起始标志位  只是这里不懂为什么还需要发送一次。。。。。。
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));         
        
        /*器件读*/
        I2C_Send7bitAddress(I2C1, EEPROM_ADDR, I2C_Direction_Receiver);    这里和上面发送Epprom的地址有何不同,主要也不懂这句话的作用
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));     
        
        
#else        
        /*发送器件地址(读)24C02*/
        I2C_Send7bitAddress(I2C1, addr<<1, I2C_Direction_Receiver);
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
#endif
        
    while (no)
    {
                if(no==1)
                {
                     I2C_AcknowledgeConfig(I2C1, DISABLE);        //最后一位后要关闭应答的         传输完后要关闭应答
                    I2C_GenerateSTOP(I2C1, ENABLE);                        //发送停止位
                }
            
                while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); /* EV7 */   //实际上是判断上次的i2c的操作是不是字节接收 ,可是并不是啊,那不应该是死循环么。我觉得这里还没有开始接收
            *pBuffer = I2C_ReceiveData(I2C1);                                
            pBuffer++;
            /* Decrement the read bytes counter */
            no--;
    }
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-10-11 21:41:42 | 显示全部楼层
期待用库的朋友解答下。
不过建议楼主早点放弃STM32的硬件IIC。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2012-10-2
在线时间
0 小时
发表于 2012-10-13 01:27:53 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
为什么要放弃?设计的不是很好?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-10-13 09:59:05 | 显示全部楼层
回复【3楼】qweasdzxcqw:
---------------------------------
不是一般的烂
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-20 04:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表