IIC模拟 && E2PROM
IIC模拟 && E2PROM
IIC_eeprom.h

#ifndef __IIC_EEPROM_H__ #define __IIC_EEPROM_H__ /***************************************************************************************** 型号 Byte容量 页数 页内字节数 WORD_ADDR位数 WORD_ADDR字节数 x24C01 128Byte 16页 8Byte 7bit 1Byte x24C02 256Byte 32页 8Byte 8bit 1Byte x24C04 512Byte 32页 16Byte 9bit 1Byte x24C08 1024Byte 64页 16Byte 10bit 1Byte x24C16 2048Byte 128页 16Byte 11bit 1Byte x24C32 4096Byte 128页 32Byte 12bit 2Byte x24C64 8192Byte 256页 32Byte 13bit 2Byte x24C128 16384Byte 256页 64Byte 14bit 2Byte x24C256 32768Byte 512页 64Byte 15bit 2Byte x24C512 65536Byte 512页 128Byte 16bit 2Byte *****************************************************************************************/ #define AT24C01 127 #define AT24C02 255 #define AT24C04 511 #define AT24C08 1023 #define AT24C16 2047 #define AT24C32 4095 #define AT24C64 8191 #define AT24C128 16383 #define AT24C256 32767 #define EE_TYPE AT24C128 #define ACK (0) #define NO_ACK (1) #define IIC_SCL_PIN PC1 #define IIC_SDA_PIN PC0 #define IIC_SDA_OUT() GPIO_SetMode(PC, BIT0, GPIO_MODE_OUTPUT) #define IIC_SDA_IN() GPIO_SetMode(PC, BIT0, GPIO_MODE_INPUT) #define SCL_HIGH() PC1 = 1 #define SCL_LOW() PC1 = 0 #define SDA_HIGH() PC0 = 1 #define SDA_LOW() PC0 = 0 #define SDA_READ() PC0 #define Device_ADDR 0xA0 #define WRITE_FLAG 0 #define READ_FLAG 1 void IIC_Init(void); void IIC_Start(void); void IIC_Stop(void); void IIC_SendAck(void); void IIC_SendNoAck(void); uint8_t IIC_WaitforAck(void); void IIC_SendByteData(uint8_t data); uint8_t IIC_RcvByteData(uint8_t ackFlag); void ROM24CXX_WriteOneByte(uint16_t WriteAddr, uint8_t DataToWrite); uint8_t ROM24CXX_ReadOneByte(uint16_t ReadAddr); void ROM24CXX_WriteLenByte(uint16_t WriteAddr, uint32_t DataToWrite, uint8_t Len); void ROM24CXX_Write(uint16_t WriteAddr, uint8_t *pBuffer, uint16_t NumToWrite); uint32_t ROM24CXX_ReadLenByte(uint16_t ReadAddr, uint8_t Len); void ROM24CXX_Read(uint16_t ReadAddr, uint8_t *pBuffer, uint16_t NumToRead); uint8_t ROM24CXX_Check(void); void Eeprom_Proc(void); #endif
IIC_eeprom.c

/** * @Author: wangxy * @Date: 2024-03-16 * @LastEditTime: 2024-03-19 * @LastEditors: wangxy * @Description: iic_eeprom * @FilePath: proj_eeprom.c */ #include "iic_eeprom.h" /** * @details: This function is IIC Init */ void IIC_Init(void) { /* Unlock protected registers */ SYS_UnlockReg(); /* Enable GPIOC clock */ CLK->AHBCLK0 |= CLK_AHBCLK0_GPCCKEN_Msk; /* Lock protected registers */ SYS_LockReg(); /* INIT SCL SDA OUTPUT */ GPIO_SetMode(PC, BIT0, GPIO_MODE_OUTPUT); GPIO_SetMode(PC, BIT1, GPIO_MODE_OUTPUT); IIC_SCL_PIN = 1; IIC_SDA_PIN = 1; } /** * @details: This function is IIC Start */ void IIC_Start(void) { IIC_SDA_OUT(); SDA_HIGH(); SCL_HIGH(); delay_us(5); SDA_LOW(); delay_us(4); SCL_LOW(); } /** * @details: This function is IIC Stop */ void IIC_Stop(void) { IIC_SDA_OUT(); SCL_LOW(); SDA_LOW(); delay_us(5); SCL_HIGH(); delay_us(4); SDA_HIGH(); delay_us(4); } /** * @details: This function is IIC SendAck */ void IIC_SendAck(void) { SCL_LOW(); IIC_SDA_OUT(); SDA_LOW(); delay_us(2); SCL_HIGH(); delay_us(4); SCL_LOW(); } /** * @details: This function is IIC SendNoAck */ void IIC_SendNoAck(void) { SCL_LOW(); IIC_SDA_OUT(); SDA_HIGH(); delay_us(4); SCL_HIGH(); delay_us(4); SCL_LOW(); } /** * @details: This function is IIC WaitforAck */ uint8_t IIC_WaitforAck(void) { uint8_t count = 0; IIC_SDA_IN(); SDA_HIGH(); delay_us(3); SCL_HIGH(); delay_us(3); while(SDA_READ()){ delay_us(1); if (count++ > 250){ IIC_Stop(); printf("IIC_WaitforAck failed\n"); return 1; } } SCL_LOW(); return 0; } /** * @details: This function is IIC Send Byte Data */ void IIC_SendByteData(uint8_t data) { uint8_t i=0; IIC_SDA_OUT(); SCL_LOW(); for(i=0; i<8; i++){ delay_us(2); if(data&0x80){ SDA_HIGH(); }else{ SDA_LOW(); } data <<= 1; delay_us(2); SCL_HIGH(); delay_us(2); SCL_LOW(); } } /** * @details: This function is IIC Rcv Byte Data */ uint8_t IIC_RcvByteData(uint8_t ackFlag) { uint8_t i; uint8_t rcvData = 0; IIC_SDA_IN(); for(i=0; i<8; i++){ SCL_LOW(); delay_us(2); SCL_HIGH(); rcvData <<= 1; if(SDA_READ()) rcvData |= 0x01; delay_us(2); } if(!ackFlag){ IIC_SendNoAck(); }else{ IIC_SendAck(); } return rcvData; } /** * @details: This function is IIC ROM24CXX_WriteOneByte */ void ROM24CXX_WriteOneByte(uint16_t WriteAddr, uint8_t DataToWrite) { IIC_Start(); if(EE_TYPE>AT24C16){ IIC_SendByteData(Device_ADDR); IIC_WaitforAck(); IIC_SendByteData(WriteAddr>>8); }else{ IIC_SendByteData(Device_ADDR+((WriteAddr/256)<<1)); } IIC_WaitforAck(); IIC_SendByteData(WriteAddr%256); IIC_WaitforAck(); IIC_SendByteData(DataToWrite); IIC_WaitforAck(); IIC_Stop(); delay_us(10); } /** * @details: This function is IIC ROM24CXX_ReadOneByte */ uint8_t ROM24CXX_ReadOneByte(uint16_t ReadAddr) { uint8_t temp=0; IIC_Start(); if(EE_TYPE>AT24C16){ IIC_SendByteData(Device_ADDR); IIC_WaitforAck(); IIC_SendByteData(ReadAddr>>8); }else{ IIC_SendByteData(Device_ADDR+((ReadAddr/256)<<1)); } IIC_WaitforAck(); IIC_SendByteData(ReadAddr%256); IIC_WaitforAck(); IIC_Start(); IIC_SendByteData(Device_ADDR | 0x01); IIC_WaitforAck(); temp=IIC_RcvByteData(0); IIC_Stop(); return temp; } /** * @details: This function is IIC ROM24CXX_WriteLenByte */ void ROM24CXX_WriteLenByte(uint16_t WriteAddr, uint32_t DataToWrite, uint8_t Len) { uint8_t t; for(t=0;t<Len;t++){ ROM24CXX_WriteOneByte(WriteAddr+t,(DataToWrite>>(8*t))&0xff); delay_ms(10); } } /** * @details: This function is IIC ROM24CXX_Write */ void ROM24CXX_Write(uint16_t WriteAddr, uint8_t *pBuffer, uint16_t NumToWrite) { while(NumToWrite--){ ROM24CXX_WriteOneByte(WriteAddr,*pBuffer); WriteAddr++; pBuffer++; delay_ms(10); } } /** * @details: This function is IIC ROM24CXX_ReadLenByte */ uint32_t ROM24CXX_ReadLenByte(uint16_t ReadAddr, uint8_t Len) { uint8_t t; uint32_t temp=0; for(t=0;t<Len;t++){ temp<<=8; temp+=ROM24CXX_ReadOneByte(ReadAddr+Len-t-1); delay_ms(10); } return temp; } /** * @details: This function is IIC ROM24CXX_Read */ void ROM24CXX_Read(uint16_t ReadAddr, uint8_t *pBuffer, uint16_t NumToRead) { while(NumToRead){ *pBuffer++=ROM24CXX_ReadOneByte(ReadAddr++); NumToRead--; delay_ms(10); } } /** * @details: This function is IIC ROM24CXX_Check */ uint8_t ROM24CXX_Check(void) { uint8_t temp; temp=ROM24CXX_ReadOneByte(0x25); if(temp==0x55){ printf("ROM24CXX_Check ok, value: 0x%x\n", temp); return 0; }else{ ROM24CXX_WriteOneByte(0x25,0x55); temp=ROM24CXX_ReadOneByte(0x25); if(temp==0x55){ printf("Again ROM24CXX_Check ok\n"); return 0; } } printf("ROM24CXX_Check failed, value: 0x%x\n", temp); return 1; } /** * @details: This function is Eeprom Proc */ void Eeprom_Proc(void) { printf("Eeprom_Proc ok"); IIC_Init(); delay_ms(100); ROM24CXX_Check(); const uint8_t TEXT_WDBuffer[]={"ROM24CXX IIC DATA READ WRITE TEST OK"}; ROM24CXX_Write(0,(uint8_t*)TEXT_WDBuffer,sizeof(TEXT_WDBuffer)); uint8_t TEXT_RDBuffer[sizeof(TEXT_WDBuffer)]; ROM24CXX_Read(0,(uint8_t*)TEXT_RDBuffer,sizeof(TEXT_WDBuffer)); printf("%s\n",TEXT_RDBuffer); for(;;){ vTaskDelay(1000); } }
Stay hungry, stay foolish
待续。。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2019-08-12 QT_环境搭建