7大函数组
- 初始化(3个:初始化,去初始化和结构体初始化,结构体见下文):XXXX_Init();XXXX_DeInit,XXXXStructInit()
- 命令(CMD,DMA_CMD,辅助功能XXXX_YYYCmd,参数为XXXn和ENABLE):XXXX_Cmd,XXXX_DMACmd,辅助功能:ARP用于SMBus
- 中断和清中断和事件:ClearITPendingBit,I2C_ITConfig,I2C_GetITStatus,I2C_CheckEvent,I2C_GetLastEvent
- 状态获取:ClearFlag,I2C_GetFlagStatus
- DMA命令: USART_DMACmd,I2C_DMALastTransferCmd
- 发送和接收
- 产生起始位:I2C_GenerateSTART
- 产生结束位:I2C_GenerateSTOP
- 响应:I2C_AcknowledgeConfig,I2C_GeneralCallCmd,响应位置:I2C_NACKPositionConfig
- 收发数据:I2C_SendData,I2C_ReceiveData
- 其他功能
- 地址管理:I2C_DualAddressCmd,I2C_OwnAddress2Config,I2C_Send7bitAddress
- 寄存器:I2C_ReadRegister
- 软件复位:I2C_SoftwareResetCmd
- SMB和PEC:I2C_SMBusAlertConfig,I2C_TransmitPEC,I2C_PECPositionConfig,I2C_CalculatePEC,I2C_GetPEC,
- 拉长时钟:I2C_StretchClockCmd
- 快速模式时占空比:I2C_FastModeDutyCycleConfig
三大结构体
1.初始化结构体(例如:和24C02通信)
- uint16_t I2C_Ack : I2C_Ack_Enable
- uint16_t I2C_AcknowledgedAddress :I2C_AcknowledgedAddress_7bit
- uint32_t I2C_ClockSpeed :400000
- uint16_t I2C_DutyCycle:I2C_DutyCycle_2
- uint16_t I2C_Mode: I2C_Mode_I2C
- uint16_t I2C_OwnAddress1 :芯片的地址0XA0
最后一个地址位,在芯片手册中能查到,看I2C存储器EEPROM需要注意下面的参数:
- I2C1_OWN_ADDRESS7,这里AT24C02为0XA0
- I2C_PageSize ATMEL芯片中,2K以下为8byte一页,4K以上16字节为一页,其他厂家有不同。
- 配置,这里全部用4.7K电阻上拉,所以GPIO模式为:GPIO_Mode_AF_OD,这样,AT24C02的初始化配置完成。
- 结构体初始化完成以后,用CMD命令打开I2C模块
AT24C02的常规操作
1. 将数组内容整体写入
- 函数名称:I2C_EE_BufferWrite
- 入口参数:待写入的数组pBuffer
- 入口参数:从哪里开始写入WriteAddr
- 入口参数:写入的个数
- 返回参数:VOID
- 调用函数:I2C_EE_WaitEepromStandbyState
- 调用函数:I2C_EE_PageWrite
void I2C_EE_BufferWrite(u8* pBuffer, u8 WriteAddr, u16 NumByteToWrite)
{
//将写入的地址和字数进行分解
//写入的数据从某页的第Addr开始写,该页还剩count可写
//要写入的数据占NumOfPage页和NumOfSingle位
u8 NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0;
Addr = WriteAddr % I2C_PageSize;
count = I2C_PageSize - Addr;
NumOfPage = NumByteToWrite / I2C_PageSize;
NumOfSingle = NumByteToWrite % I2C_PageSize;
//如果从第0位开始写
if(Addr == 0)
{
//从0页开始写,少于8字节,只需要写一页
if(NumOfPage == 0)
{
I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);
I2C_EE_WaitEepromStandbyState();
}
//从0页开始写,要写的数据超过一页
else
{
//把所有的页面写完,再写完剩下不足一页的字节
//这里,while循环一直到NumOfPage=0
while(NumOfPage--)
{
I2C_EE_PageWrite(pBuffer, WriteAddr, I2C_PageSize);
I2C_EE_WaitEepromStandbyState();
//第一页写完,地址加上8,缓存加上8
WriteAddr += I2C_PageSize;
pBuffer += I2C_PageSize;
}
//写完不足一页的内容
if(NumOfSingle!=0)
{
I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);
I2C_EE_WaitEepromStandbyState();
}
}
}
//如果不从第0位开始写
else
{
//写入的数据不足一页
if(NumOfPage== 0)
{
I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);
I2C_EE_WaitEepromStandbyState();
}
else
{
//将剩下的位写完以后,然后就相当于从0位开始写
NumByteToWrite -= count;
NumOfPage = NumByteToWrite / I2C_PageSize;
NumOfSingle = NumByteToWrite % I2C_PageSize;
//当然!=0
if(count != 0)
{
I2C_EE_PageWrite(pBuffer, WriteAddr, count);
I2C_EE_WaitEepromStandbyState();
//地址和缓冲器要移动
WriteAddr += count;
pBuffer += count;
}
//同上文,继续写完需要写的页数,和剩余字节
while(NumOfPage--)
{
I2C_EE_PageWrite(pBuffer, WriteAddr, I2C_PageSize);
I2C_EE_WaitEepromStandbyState();
WriteAddr += I2C_PageSize;
pBuffer += I2C_PageSize;
}
if(NumOfSingle != 0)
{
I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);
I2C_EE_WaitEepromStandbyState();
}
}
}
}