小学生
最后登录1970-1-1
在线时间 小时
注册时间2023-9-13
|
疑问点就在下面这个读字节内容里:
问题:这部分内容是正常写入过程,但是当把<<printf("原始代码!!\r\n");>>这条语句删除,测试过程就不正常了
void I2C_EEPROM_ReadByte(I2C_TypeDef* I2Cx,uint8_t addr,uint8_t *data)
{
#if 1
/***********原始代码,无法顺利读取,读取过程卡死状态,按键复位也无效***********/
printf("原始代码!!\r\n");
//发送起始信号
I2C_GenerateSTART(I2Cx, ENABLE);
while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_MODE_SELECT) != SUCCESS);
//printf("起始信号发送正常!!\r\n");
//发送设备地址
I2C_Send7bitAddress(I2Cx, EE_ADDRESS_READ,I2C_Direction_Transmitter);
while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) != SUCCESS);
printf("地址信号发送正常!!\r\n");
I2C_Cmd(I2Cx, ENABLE);
//发送地址数据
I2C_SendData(I2Cx, addr);
while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_BYTE_TRANSMITTED ) != SUCCESS);
//printf("地址方向写入OK!!\n");
//发送起始信号
I2C_GenerateSTART(I2Cx, ENABLE);
while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_MODE_SELECT) != SUCCESS);
//发送设备地址
I2C_Send7bitAddress(I2Cx, EE_ADDRESS_READ,I2C_Direction_Receiver);
//printf("读取地址方向成功到达!!\n");
while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) != SUCCESS);
//检测EV7事件
while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_BYTE_RECEIVED) != SUCCESS);
//非应答
I2C_AcknowledgeConfig(I2Cx,DISABLE);
//发送停止位
I2C_GenerateSTOP(I2Cx, ENABLE);
//读取数据
*data = I2C_ReceiveData(I2Cx);
printf("接收事件完成!!\n");
//重新使能
I2C_AcknowledgeConfig(I2Cx,ENABLE);
}
正常的写函数如下:
//单字节写入
void I2C_EEPROM_WriteByte(I2C_TypeDef* I2Cx,uint8_t addr,uint8_t *data)
{
//printf("写字节数据开始!!\r\n");
//发送起始信号
I2C_GenerateSTART(I2Cx, ENABLE);
while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_MODE_SELECT) != SUCCESS);
//printf("写起始发送正常!!\r\n");
//发送设备地址
I2C_Send7bitAddress(I2Cx, EE_ADDRESS_READ,I2C_Direction_Transmitter);
while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) != SUCCESS);
//printf("写地址发送完毕!!\r\n");
//发送字地址
I2C_SendData(I2Cx, addr);
while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_BYTE_TRANSMITTED ) != SUCCESS);
//printf("写地址地址数据正常!!\r\n");
//发送数据
I2C_SendData(I2Cx, *data);
while(I2C_CheckEvent(I2Cx,I2C_EVENT_MASTER_BYTE_TRANSMITTED ) != SUCCESS);
//printf("写数据完毕!!\r\n");
//发送停止位
I2C_GenerateSTOP(I2Cx, ENABLE);
}
主函数部分如下:
int main(void)
{
uint8_t ReadData = 0;
uint8_t WriteData = 0x55;
GPIO_LED_Config();
USART_Config();
IIC_EE_Config();
printf("往EEPROM里写入了一个字节数据\n");
I2C_EEPROM_WriteByte(IIC1_PORT,1,&WriteData);
LED_G;
IIC_Query_EEPROM_State(IIC1_PORT);
LED_B;
I2C_EEPROM_ReadByte(IIC1_PORT,1,&ReadData);
printf("从EEPROM读取到的数据为:0x%x\r\n\r\n",ReadData);
LED_R;
while(1)
{
}
return 0;
}
其他配置和野火资料一样
|
|