打印

硬件IIC测试成功!

[复制链接]
4876|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tianli1980|  楼主 | 2014-2-10 20:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
寻觅了好多代码,终于找到一个成功的。与大家分享下:
**********************************************************************/
/*IIC配置                                                                                     */
/*                                                                                                                       


                 */
/**********************************************************************/
void Iic_Init()
{
        GPIO_InitTypeDef GPIO_InitStructure;


        I2C_InitTypeDef I2C_InitStructure;
         
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
        /* Configure IO connected to IIC*********************/
        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
       
        I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
        I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
        I2C_InitStructure.I2C_OwnAddress1 = 0xa0;  //这里是eeprom地址  
        I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
        I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
        I2C_InitStructure.I2C_ClockSpeed = 200000;
         
        I2C_Cmd(I2C2, ENABLE);   


        I2C_Init(I2C2, &I2C_InitStructure);
}
/**********************************************************************/
/*IIC写一个字节                                                                             */
/*                id:eeprom地址   write_address:要写入的地址          byte:写入的数据                                                                                       


                 */
/**********************************************************************/
void I2C_WriteByte(unsigned char id,unsigned char write_address,unsigned char byte)   
{
        I2C_GenerateSTART(I2C2,ENABLE);
        //产生起始条件
        while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
        //等待ACK
        I2C_Send7bitAddress(I2C2,id,I2C_Direction_Transmitter);
        //向设备发送设备地址
        while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
        //等待ACK
        I2C_SendData(I2C2, write_address);
        //寄存器地址
        while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
        //等待ACK
        I2C_SendData(I2C2, byte);
        //发送数据
        while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
        //发送完成
        I2C_GenerateSTOP(I2C2, ENABLE);
        //产生结束信号
}
/**********************************************************************/
/*IIC读数据                                                                                      */
/*                                                                                                                       


                 */
/**********************************************************************/
unsigned char I2C_ReadByte(unsigned char  id, unsigned char read_address)
{  
        unsigned char temp;        


        while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
          //等待I2C
          I2C_GenerateSTART(I2C2, ENABLE);
          //产生起始信号
          while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
    //EV5
          I2C_Send7bitAddress(I2C2, id, I2C_Direction_Transmitter);
        //发送地址
          while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
          //EV6
          I2C_Cmd(I2C2, ENABLE);
        //重新设置可以清楚EV6
          I2C_SendData(I2C2, read_address);  
        //发送读得地址
          while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
          //EV8
          I2C_GenerateSTART(I2C2, ENABLE);
        //重新发送
          while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
          //EV5
          I2C_Send7bitAddress(I2C2, id, I2C_Direction_Receiver);
          //发送读地址
          while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
          //EV6  
    I2C_AcknowledgeConfig(I2C2, DISABLE);
    I2C_GenerateSTOP(I2C2, ENABLE);
        //关闭应答和停止条件产生
    while(!(I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_RECEIVED)));
             
    temp = I2C_ReceiveData(I2C2);
   
          I2C_AcknowledgeConfig(I2C2, ENABLE);


        return temp;
}








沙发
拿起书本| | 2014-2-10 22:26 | 只看该作者
传说中硬件IIC是硬伤 ,真心感谢楼主的分享,顶起。

使用特权

评论回复
板凳
FAQ| | 2014-2-11 09:26 | 只看该作者
应该是很多人不会用罢了

使用特权

评论回复
地板
zhangyang86| | 2014-2-11 11:37 | 只看该作者
恭喜

使用特权

评论回复
5
busdriver| | 2014-2-11 12:10 | 只看该作者
gongxi

使用特权

评论回复
6
BBSTOM| | 2014-2-12 11:53 | 只看该作者
本帖最后由 BBSTOM 于 2014-2-12 11:54 编辑

孩止你伤不起啊!
老子就不用ST的硬件I2C.

不是不会用。是这个硬件I2C模块就是个奇葩。

使用特权

评论回复
7
zhangyang86| | 2014-2-12 12:36 | 只看该作者
BBSTOM 发表于 2014-2-12 11:53
孩止你伤不起啊!
老子就不用ST的硬件I2C.

嗯。这中间很多问题确实很难讲。。。。

使用特权

评论回复
8
chinahuangyong| | 2014-12-8 19:50 | 只看该作者
这样的硬件果断是不能用的吧

使用特权

评论回复
9
苏山人家| | 2014-12-8 21:52 | 只看该作者
不用,害怕死掉,反正对速率没要求,我还是模拟吧!

使用特权

评论回复
10
苏山人家| | 2014-12-8 21:52 | 只看该作者
不用,害怕死掉,反正对速率没要求,我还是模拟吧!

使用特权

评论回复
11
bear1| | 2014-12-8 22:31 | 只看该作者
苏山人家 发表于 2014-12-8 21:52
不用,害怕死掉,反正对速率没要求,我还是模拟吧!

楼主经过实践测试过的程序,也会死掉吗?

使用特权

评论回复
12
搞IT的| | 2014-12-8 23:41 | 只看该作者
进来看看。。。。

使用特权

评论回复
13
奔牛滚滚| | 2014-12-9 09:59 | 只看该作者
跑不死的才能说能用:lol

使用特权

评论回复
14
苏山人家| | 2014-12-9 13:21 | 只看该作者
本帖最后由 苏山人家 于 2014-12-9 13:23 编辑
bear1 发表于 2014-12-8 22:31
楼主经过实践测试过的程序,也会死掉吗?

我没测试过楼主的硬件代码,所以不评论
但是根据STM32  硬件IIC的尿性,我还是不在实际项目中尝试了!

使用特权

评论回复
15
hj356| | 2015-3-5 23:54 | 只看该作者
大量的while,不知道有没有超时判断。还是用IO模拟算了。

使用特权

评论回复
16
zale1204| | 2015-5-23 14:56 | 只看该作者
代码还是比较清晰,主模式的发送和接收。不知道在哪里有从模式的接收和发送。

使用特权

评论回复
17
lsh505| | 2015-5-23 16:03 | 只看该作者
STM32的硬件I2C,实践中证明,测试通,不等于就稳定了

使用特权

评论回复
18
fanxsd| | 2015-5-23 16:04 | 只看该作者
这个代码不实用吧,现实工程中 用这么多 while,如果检测不到 不就死了吗??

使用特权

评论回复
19
fanxsd| | 2015-5-24 11:30 | 只看该作者
FAQ 发表于 2014-2-11 09:26
应该是很多人不会用罢了

估计你会用,也是bug

使用特权

评论回复
20
fanxsd| | 2015-5-24 11:31 | 只看该作者
bear1 发表于 2014-12-8 22:31
楼主经过实践测试过的程序,也会死掉吗?

楼主的代码不用跑,就知道 能死掉。看那一堆 while吧

使用特权

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

本版积分规则

482

主题

2214

帖子

11

粉丝