打印

IIC主设备读操作问题

[复制链接]
2415|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jy02326166|  楼主 | 2013-2-2 12:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
iic, I2c, TE, ST, ev
static u8 I2C_MMA_ByteRead(u8 ReadAddr)
{
        u8 RxData;
        /*wait until I2C bus is not busy*/
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
       
        /* Send START condition */
        I2C_GenerateSTART(I2C1, ENABLE);
       
        /* Test on EV5 and clear it */
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
       
        /* Send MMA address for write */
        I2C_Send7bitAddress(I2C1, MMA_ADRESS, I2C_Direction_Transmitter);
       
        /* Test on EV6 and clear it */
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
       
        /* Clear EV6 by setting again the PE bit */
        I2C_Cmd(I2C1, ENABLE);
       
        /* Send the MMA's Register address to write to */
        I2C_SendData(I2C1, ReadAddr);  
       
        /* Test on EV8 and clear it */
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
       
        /* Send STRAT condition a second time */  
        I2C_GenerateSTART(I2C1, ENABLE);
       
        /* Test on EV5 and clear it */
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
       
        /* Send MMA address for read */
        I2C_Send7bitAddress(I2C1, MMA_ADRESS, I2C_Direction_Receiver);
       
        /* Test on EV6 and clear it */
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
       
        /* Test on wait for EV7 */
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
       
        /* Read a byte from the MMA Register */
        RxData = I2C_ReceiveData(I2C1);                         
       
        /* Disable Acknowledgement */
        I2C_AcknowledgeConfig(I2C1, DISABLE);
       
        /* Send STOP Condition */
        I2C_GenerateSTOP(I2C1, ENABLE);
       
        /*Retrun Data*/
        return RxData;
}

1.
I2C_Cmd(I2C1, ENABLE);这一句有什么用?

2.
I2C_AcknowledgeConfig(I2C1, DISABLE);
I2C_GenerateSTOP(I2C1, ENABLE);
手册:只接收一个字节时,将在EV6 时进行关闭应答和停止条件生成操作。
这两句放在了最后面,有没有问题?
沙发
21ID| | 2013-2-2 13:47 | 只看该作者
1: 开启I2C

使用特权

评论回复
板凳
TT5656| | 2013-2-2 15:25 | 只看该作者
1.是为了设置PE使能位,但其实在I2C_Init()里面已经使能了PE位,所以I2C_Init()过了之后就不需要这一句了,我是这样理解的。
2.有没有问题试一下就知道啦,不过估计会有问题的,该产生非应答的时候没有产生会影响接收时序的,lz可以试试,最好按手册上说的,在EV6之后加那两句吧

使用特权

评论回复
地板
uet_cache| | 2013-2-2 17:52 | 只看该作者
建议用模拟IIC, 硬件IIC很难用。

使用特权

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

本版积分规则

35

主题

105

帖子

0

粉丝