1111

/**
 * @Author: wangxy
 * @Date: 2024-03-16
 * @LastEditTime: 2024-03-19
 * @LastEditors: wangxy
 * @Description: proj_eeprom
 * @FilePath: proj_eeprom.c
 */

#include "proj_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)
{
    SCL_LOW();  //保证SCL为低
    IIC_SDA_OUT();
    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();  //保证SCL为低
    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();  //保证SCL为低
    IIC_SDA_OUT();
    SDA_HIGH();
    delay_us(4);
    SCL_HIGH();
    delay_us(4);
    SCL_LOW();  //钳住时钟,开始下一次发送数据
}

/**
 * @details: This function is IIC WaitforAck
 */
int8_t IIC_WaitforAck(void)
{
    uint8_t count = 0;
    SCL_LOW();  //保证SCL为低
    IIC_SDA_IN();
    SDA_HIGH();
    delay_us(3);
    SCL_HIGH();
    delay_us(3);
    while(SDA_READ()){
        delay_us(1);
        if (count++ > 250){
            IIC_Stop();
            RS_LOGE("IIC_WaitforAck failed\n");
            return -1;
        }
    }
    SCL_LOW();  //钳住时钟,开始下一次发送数据
    return 0;
}

/**
 * @details: This function is IIC Send Byte Data
 */
int8_t IIC_SendByteData(uint8_t data)
{
    uint8_t i=0;
    SCL_LOW();  //保证SCL为低
    IIC_SDA_OUT();
    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();   //钳住时钟,开始下一次发送数据
    }
    //发送完成等待ACK
    retuen IIC_WaitforAck();
}

/**
 * @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){
        //发送NOACK
        IIC_SendNoAck();
    }else{
        //发送ACK
        IIC_SendAck();
    }
    SCL_LOW();   //钳住时钟,开始下一次发送数据
    return rcvData;
}



/**
 * @details: This function is IIC ROM24CXX_WriteOneByte
 */
int8_t ROM24CXX_WriteOneByte(uint16_t WriteAddr, uint8_t DataToWrite)
{
    IIC_Start();
    if(EE_TYPE>AT24C16){
        if(IIC_SendByteData(Device_ADDR)<0){
            return -1;
        }
        if(IIC_SendByteData(WriteAddr>>8)<0){
            return -1;
        }
    }else{
        if(IIC_SendByteData(Device_ADDR+((WriteAddr/256)<<1))){
            return -1;
        }
    }
    if(IIC_SendByteData(WriteAddr%256)<0){
        return -1;
    }
    if(IIC_SendByteData(DataToWrite)<0){
        return -1;
    }
    IIC_Stop();
    delay_us(10);
}

/**
 * @details: This function is IIC ROM24CXX_ReadOneByte
 */
int8_t ROM24CXX_ReadOneByte(uint16_t ReadAddr)
{
    uint8_t temp=0;
    IIC_Start();
    if(EE_TYPE>AT24C16){
        if(IIC_SendByteData(Device_ADDR)<0){
            return -1;
        }
        if(IIC_SendByteData(ReadAddr>>8)<0){
            return -1;
        }
    }else{
        if(IIC_SendByteData(Device_ADDR+((ReadAddr/256)<<1))){
            return -1;
        }
    }
    if(IIC_SendByteData(ReadAddr%256)){
        return -1;
    }
    IIC_Start();
    if(IIC_SendByteData(Device_ADDR | 0x01)){
        return -1;
    }
    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){
        RS_LOGV("ROM24CXX_Check ok, value: 0x%x\n", temp);
        return 0;
    }else{
        ROM24CXX_WriteOneByte(0x25,0x55);
        temp=ROM24CXX_ReadOneByte(0x25);
        if(temp==0x55){
            RS_LOGV("Again ROM24CXX_Check ok\n");
            return 0;
        }
    }
    RS_LOGE("ROM24CXX_Check failed, value: 0x%x\n", temp);
    return 1;
}

/**
 * @details: This function is Eeprom Proc
 */
void Eeprom_Proc(void)
{
    RS_LOGV("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));
    RS_LOGV("%s\n",TEXT_RDBuffer);
    for(;;){
        vTaskDelay(1000);
    }
}

  

posted @ 2025-03-11 18:04  panda_w  阅读(8)  评论(0)    收藏  举报