STM32f407的 I2C 卡的问题 求解
时间:10-02
整理:3721RD
点击:
最近想用STM32F407的I2C控制从元件的寄存器,但是总是卡在一个地方,不知道为什么!求解啊 !
下面是卡的的地方,我都标出来了,,求帮助!
/*******************************************************************************
* Function Name : I2C_WriteOneByte
* Description : 通过指定I2C接口写入一个字节数据
* Input : - I2Cx:I2C寄存器基址
* - I2C_Addr:从器件地址
* - addr:预写入字节地址
* - value:写入数据
* Output : None
* Return : 成功返回0
* Attention : None
*******************************************************************************/
uint8_t I2C_WriteOneByte(I2C_TypeDef *I2Cx, uint8_t I2C_Addr, uint8_t addr, uint8_t value)
{
/* 起始位 */
I2C_AcknowledgePolling(I2Cx,I2C_Addr);
while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY)); ////卡主的地方
I2C_GenerateSTART(I2Cx, ENABLE); //
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));
// /* 发送器件地址(写)*/
I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Transmitter);
// while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) ///卡住的地方
// {
// I2C_delay(100);
// }
// /*发送地址*/
I2C_SendData(I2Cx, addr);
// while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //////卡住的地方
//
// /* 写一个字节*/
I2C_SendData(I2Cx, value);
// while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); /////卡住的地方
// /* 停止位*/
I2C_GenerateSTOP(I2Cx, ENABLE);
I2C_AcknowledgePolling(I2Cx,I2C_Addr);
I2C_delay(1000);
return 0;
}
下面是卡的的地方,我都标出来了,,求帮助!
/*******************************************************************************
* Function Name : I2C_WriteOneByte
* Description : 通过指定I2C接口写入一个字节数据
* Input : - I2Cx:I2C寄存器基址
* - I2C_Addr:从器件地址
* - addr:预写入字节地址
* - value:写入数据
* Output : None
* Return : 成功返回0
* Attention : None
*******************************************************************************/
uint8_t I2C_WriteOneByte(I2C_TypeDef *I2Cx, uint8_t I2C_Addr, uint8_t addr, uint8_t value)
{
/* 起始位 */
I2C_AcknowledgePolling(I2Cx,I2C_Addr);
while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY)); ////卡主的地方
I2C_GenerateSTART(I2Cx, ENABLE); //
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));
// /* 发送器件地址(写)*/
I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Transmitter);
// while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) ///卡住的地方
// {
// I2C_delay(100);
// }
// /*发送地址*/
I2C_SendData(I2Cx, addr);
// while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //////卡住的地方
//
// /* 写一个字节*/
I2C_SendData(I2Cx, value);
// while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); /////卡住的地方
// /* 停止位*/
I2C_GenerateSTOP(I2Cx, ENABLE);
I2C_AcknowledgePolling(I2Cx,I2C_Addr);
I2C_delay(1000);
return 0;
}
i2c初始化可能有问题 贴一下初始化的代码
猜测:检测总线状态时,是否有释放主机对总线的控制权,才进行读取。
while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY)); 这条应该是检测I2C总线是否空闲,应该是没有收到ACK吧!你这是个硬件I2C通信吧!
是否是你I2C硬件初始化是否不成功,没初始化好呢