这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » STM32 iic总线的初始化和发送接收数据问题

共4条 1/1 1 跳转至

STM32 iic总线的初始化和发送接收数据问题

菜鸟
2014-07-19 23:20:35     打赏

我自己写的Init iic还有利用stm32 v3.5的固件库写的接收或者发送数据的函数

但是 每次下载运行 代码总是执行到while(SET != I2C_GetFlagStatus(I2Cx,I2C_FLAG_SB));这句话就下不去了,就是在发送开始信号以后 就不行了

以下是我的代码  求指教啊


 #include "i2c.h"

void I2C2_InitConfig(void)
{
I2C_InitTypeDef I2C_InitStruct; //i2c初始化结构体
GPIO_InitTypeDef GPIO_InitStruct;//gpio初始化结构体

RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

GPIO_InitStruct.GPIO_Pin =  GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_OD; //复用开漏输出
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
GPIO_SetBits(GPIOB,GPIO_Pin_10 | GPIO_Pin_11);

I2C_DeInit(I2C2);  //设置I2C寄存器为缺省值
I2C_InitStruct.I2C_Mode = I2C_Mode_I2C;
I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStruct.I2C_OwnAddress1 = 0;
I2C_InitStruct.I2C_Ack = I2C_Ack_Enable;
I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStruct.I2C_ClockSpeed = 100000;    //100k
I2C_Init(I2C2,&I2C_InitStruct);

I2C_Cmd(I2C2,ENABLE); //使能I2C2
}
/*
函数名:I2C_SendByte
功能:利用I2C总线发送一个字节的数据
参数1:选择I2Cx总线  x=1 or 2
参数2: Write /  Read 写入或接收数据
参数3:一个字节的数据指针
参数4:从设备地址
参数5:使用的从设备寄存器地址
*/
void I2C_WRbyte(I2C_TypeDef * I2Cx,u8 CtrlBit,u8 *buffer,u8 SlaveAddr,u8 RegAddr)
{
I2C_GenerateSTART(I2Cx,ENABLE);  //使能总线数据开始位
while(SET != I2C_GetFlagStatus(I2Cx,I2C_FLAG_SB)); //等待起始位标志位被设置,进入主模式

I2C_Send7bitAddress(I2Cx,SlaveAddr,I2C_Direction_Transmitter); //寻址,发送地址等待从设备应答
while(SET != I2C_GetFlagStatus(I2Cx,I2C_FLAG_ADDR)); /t after the ACK of the byte.成功地址发送标志位(主模式)

I2C_SendData(I2Cx,RegAddr); //发送寄存器地址
while(SET != I2C_GetFlagStatus(I2Cx,I2C_FLAG_BTF)); //等待寄存器地址发送完成

I2C_GenerateSTART(I2Cx,ENABLE);  //使能总线数据开始位
while(SET != I2C_GetFlagStatus(I2Cx,I2C_FLAG_SB)); //等待起始位标志位被设置,进入读取或写入模式

if(Write == CtrlBit){ //写数据到寄存器

I2C_Send7bitAddress(I2Cx,SlaveAddr,I2C_Direction_Transmitter); //方向:发送 发送寄存器地址等待从设备应答
while(SET != I2C_GetFlagStatus(I2Cx,I2C_FLAG_ADDR)); /t after the ACK of the byte.成功地址发送标志位(主模式)

I2C_SendData(I2Cx,*buffer);  //发送数据给寄存器

I2C_GenerateSTOP(I2Cx,ENABLE); //使能终止标志位
}
else if(Read == CtrlBit){ //从寄存器中读取数据

I2C_Send7bitAddress(I2Cx,SlaveAddr,I2C_Direction_Receiver); //方向:接收 发送寄存器地址等待从设备应答
while(SET != I2C_GetFlagStatus(I2Cx,I2C_FLAG_ADDR)); /t after the ACK of the byte.成功地址发送标志位(主模式)

*buffer = I2C_ReceiveData(I2Cx); //接收数据

I2C_GenerateSTOP(I2Cx,ENABLE); //使能终止标志位
}





关键词: iic i2c      总线     STM32     初始化     发送         

工程师
2014-07-22 06:49:40     打赏
2楼

STM32的硬件IIC确实有些麻烦,楼主可以想想其它办法,或是检测一下两个脚的波形,或是用软件ICC试试。


院士
2014-07-24 23:20:09     打赏
3楼

这个对于STM32来说是一个硬 bug

 目前的解决方案是使用模拟时序的方式来解决IIC的硬件接口超时的bug。



高工
2014-07-25 19:36:33     打赏
4楼
干的怎么样,硬件的不好搞吧

共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]