我自己写的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); //使能终止标志位
}
}