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.h
复制代码

 

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);
    }
}
IIC_EEPROM.c
复制代码

 

 
posted @   panda_w  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2019-08-12 QT_环境搭建
点击右上角即可分享
微信分享提示