今天在练习IIC实验时,程序参考重新录制的视频写的,发现没有输出相应结果,调试时发现死在CheckEvent里无法出来,即在写字节函数中的事件EV5处停住没出来(//EV5事件被检测到,发送设备地址
while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_MODE_SELECT)==ERROR);),请问要怎样修改?
这是程序:
#include "bsp_i2c_eeprom.h"
void I2C_EEPROM_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
I2C_APBxClock_FUN(I2C_Clock,ENABLE);
I2C_GPIO_APBxClock_FUN(I2C_GPIO_Clock,ENABLE);
GPIO_InitStructure.GPIO_Pin=I2C_SCL_PIN;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_OD;
GPIO_Init(I2C_SCL_PORT,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=I2C_SDA_PIN;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_OD;
GPIO_Init(I2C_SDA_PORT,&GPIO_InitStructure);
I2C_InitStructure.I2C_Ack=I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed=I2C_Speed;
I2C_InitStructure.I2C_DutyCycle=I2C_DutyCycle_16_9 ;
I2C_InitStructure.I2C_Mode=I2C_Mode_I2C ;
I2C_InitStructure.I2C_OwnAddress1=I2CX_OWN_ADDRESS;
I2C_Init(I2Cx, &I2C_InitStructure);
I2C_Cmd(I2Cx, ENABLE);
}
void EEPROM_Byte_Write(uint8_t addr,uint8_t data)
{
//发送起始信号
I2C_GenerateSTART(I2Cx, ENABLE);
//EV5事件被检测到,发送设备地址
while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_MODE_SELECT)==ERROR);
I2C_Send7bitAddress(I2Cx, EEPROM_ADDRESS, I2C_Direction_Transmitter);
while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)==ERROR);
//EV6事件被检测到,发送要操作的存储单元地址
I2C_SendData(I2Cx, addr);
while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_BYTE_TRANSMITTING)==ERROR);
//EV8事件被检测到,发送要存储的数据
I2C_SendData(I2Cx, data);
while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_BYTE_TRANSMITTED)==ERROR);
//数据传输完成
I2C_GenerateSTOP(I2Cx, ENABLE);
}
void EEPROM_Byte_Read(uint8_t addr,uint8_t *data,uint8_t NumByteToRead)
{
// while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY));
//发送起始信号
I2C_GenerateSTART(I2Cx, ENABLE);
//检测EV5事件并清除标志
while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_MODE_SELECT)==ERROR);
/* 发送 EEPROM 设备地址+写方向 */
I2C_Send7bitAddress(I2Cx, EEPROM_ADDRESS, I2C_Direction_Transmitter);
/* 检测 EV6 事件并清除标志*/
while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)==ERROR);
// I2C_Cmd(I2Cx, ENABLE);
/* 发送要读取的 EEPROM 内部地址(即 EEPROM 内部存储器的地址) */
I2C_SendData(I2Cx, addr);
/* 检测 EV8 事件并清除标志*/
while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_BYTE_TRANSMITTING)==ERROR);
//第二次起始信号
//产生起始信号
I2C_GenerateSTART(I2Cx, ENABLE);
/* 检测 EV5 事件并清除标志*/
while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_MODE_SELECT)== ERROR);
/* 发送 EEPROM 设备地址 + 读方向*/
I2C_Send7bitAddress(I2Cx, EEPROM_ADDRESS, I2C_Direction_Receiver);
//事件6被检测到
while(!I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
/* 读取 NumByteToRead 个数据*/
while(NumByteToRead)
{
if(NumByteToRead==1)
{
//如果为最后一个字节
I2C_AcknowledgeConfig(I2Cx, DISABLE);
}
while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_BYTE_RECEIVED)==ERROR);
//事件7被检测到,即数据寄存器有新的有效数据
*data=I2C_ReceiveData(I2Cx);
}
data++;
NumByteToRead--;
I2C_GenerateSTOP(I2Cx, ENABLE);
//重新配置ACK使能,以便下次通讯
I2C_AcknowledgeConfig(I2Cx, ENABLE);
}
void EEPROM_WaitForWriteEnd(void)
{
do
{
I2C_GenerateSTART(I2Cx, ENABLE);
while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_SB)==RESET);
I2C_Send7bitAddress(I2Cx, EEPROM_ADDRESS, I2C_Direction_Transmitter);
}
while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_ADDR)==RESET);
I2C_GenerateSTOP(I2Cx, ENABLE);
} |