27,374
社区成员
发帖
与我相关
我的任务
分享
#define AT24C02_ADDR 0xA0
#define I2C_Speed 200000
//main函数
int main(void)
{
RCC_Configuration(); //系统时钟初始化
GPIO_Configuration();//端口初始化
USART_Configuration();
NVIC_Configuration();
I2C2_Configuration();
printf("init finish\r\n");
delay_ms(10);
AT24C02_WriteOnebyte(0x8,0xfe);
while(1)
{
printf("test code=%x\n", AT24C02_ReadOneByte(0x8));
delay_ms(1000);
}
}
//I2C 端口初始化
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
//I2C 初始化
void I2C2_Configuration(void)
{
I2C_InitTypeDef I2C_InitStructure;
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;
// I2C_ITConfig(I2C2,I2C_IT_EVT|I2C_IT_BUF,ENABLE);
I2C_Init(I2C2, &I2C_InitStructure);
I2C_Cmd(I2C2, ENABLE);
I2C_AcknowledgeConfig(I2C2, ENABLE);
}
void AT24C02_WriteOnebyte(u8 addr,u8 dt)
{
while(I2C_GetFlagStatus(I2C2,I2C_FLAG_BUSY));
I2C_GenerateSTART(I2C2, ENABLE); //delay(0x1ff); //// Send STRAT condition ////
while( !I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT) ); /* Test on EV5 and clear it 起始位已经发送 */
I2C_Send7bitAddress(I2C2, AT24C02_ADDR, I2C_Direction_Transmitter); // delay(0x1ff); ////Send 0xA6 for connect ////
while( !I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) ); /* Test on EV6 and clear it 地址已发送 */
I2C_SendData(I2C2, addr); //delay(0x1ff); //// Send the reg_buffer to write to ////
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); /* Test on EV8 and clear it 发送缓冲区空 */
I2C_SendData(I2C2, dt);// delay(0x1ff); //// Send the set_buffer to be written ////
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); /* Test on EV8 and clear it 发送缓冲区空 (即发完了)*/
I2C_GenerateSTOP(I2C2, ENABLE); //// Send STOP condition ////
delay_ms(10);
}
u8 AT24C02_ReadOneByte(u8 addr)
{
u8 RxData;
I2C_Cmd(I2C2, ENABLE);
while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));
I2C_GenerateSTART(I2C2, ENABLE);
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C2, AT24C02_ADDR, I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(I2C2, addr);
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTART(I2C2, ENABLE);
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C2, AT24C02_ADDR, I2C_Direction_Receiver);
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_RECEIVED));
RxData = I2C_ReceiveData(I2C2);
I2C_AcknowledgeConfig(I2C2, DISABLE);
I2C_GenerateSTOP(I2C2, ENABLE);
return RxData;
}