HAL库配置IIC接口的EEPROM AT24C64

 

IO引脚在stm32f1xx_hal_msp.c里面。

 

关于HAL库中stm32f1xx_hal_msp.c文件的认知

https://www.stmcu.org.cn/module/forum/thread-620752-1-3.html

 

 

 

 

typedef uint8_t u8;
typedef uint16_t u16;
typedef uint32_t u32;
#define AT24CXX_DEV_ADDRESS     0xA0  //写指令IIC地址
#define AT24CXX_DELAY_MS        HAL_Delay
int i = 0;

//值得注意的是AT24C64的地址是16位的,并且内部写EPPROM空间的时间最长为5ms,
//之前被这里坑了很久,差点以为I2C的库函数存在问题,所以上方的代码中尝试了多种读取参数的方式。

/*

Memory Organization
AT24C32/64, 32K/64K SERIAL EEPROM: The 32K/64K is
internally organized as 256 pages of 32 bytes each. Ran-
dom word addressing requires a 12/13 bit data word
address.

32 bytes each===每个页共32个字节
*/

void AT24CXX_WriteByte(u16 reg_address,u8 data)
{
    static HAL_StatusTypeDef i;
    i = HAL_I2C_Mem_Write(&hi2c1,AT24CXX_DEV_ADDRESS,reg_address,I2C_MEMADD_SIZE_16BIT,&data,1,100);
    AT24CXX_DELAY_MS(5);    //AT24C64的最长写入时间是5ms
}



u8 AT24CXX_ReadByte(u16 reg_address)
{
    u8 data = 0;
    u8 temp[2];
    temp[0] = reg_address>>8;
    temp[1] = reg_address;
    //HAL_I2C_Master_Transmit(&hi2c1,AT24CXX,temp,2,100);
    //HAL_I2C_Master_Receive(&hi2c1,AT24CXX,&data,1,100);

    HAL_I2C_Mem_Read(&hi2c1,AT24CXX_DEV_ADDRESS,reg_address,I2C_MEMADD_SIZE_16BIT,&data,2,100);
    return data;
}


/****************************************************************************
* 名    称: void AT24C02_Write(u8 WriteAddr,u8 *pBuffer,u8 WriteNum)
* 功    能:从AT24C02里面的指定地址开始写入指定个数的数据
* 入口参数:WriteAddr :开始写入的地址  0~255
            pBuffer  :数据数组首地址
            WriteNum:要写入数据的个数
* 返回参数:
* 说    明:  
****************************************************************************/
void AT24C64_Write(u16 WriteAddr,u8 *pBuffer,u8 WriteNum)
{
    while(WriteNum--)
    {
        AT24CXX_WriteByte(WriteAddr,*pBuffer);
        WriteAddr++;
        pBuffer++;
    }
}


/****************************************************************************
* 名    称: void AT24C02_Read(u8 ReadAddr,u8 *pBuffer,u8 ReadNum)
* 功    能:从AT24C02里面的指定地址开始读出指定个数的数据
* 入口参数:ReadAddr :开始读出的地址  0~255
            pBuffer  :数据数组首地址
            ReadNum:要读出数据的个数
* 返回参数:
* 说    明:  
****************************************************************************/
void AT24C64_Read(u16 ReadAddr,u8 *pBuffer,u8 ReadNum)
{
    while(ReadNum--)
    {
        *pBuffer++=AT24CXX_ReadByte(ReadAddr++);    
    }
} 

/****************************************************************************
* 名    称: u8 AT24C02_Test(void)
* 功    能:测试AT24C02是否正常
* 入口参数:无
* 返回参数:返回1:检测失败
            返回0:检测成功 
* 说    明:  
****************************************************************************/
u8 AT24C02_Test(void)
{
    u8 Testdata;
    Testdata=AT24CXX_ReadByte(255); //如果开机测试,已有值无需再次写入       
    if(Testdata==0XAB)return 0;           
    else                             
    {
        AT24CXX_WriteByte(255,0XAB);
      Testdata=AT24CXX_ReadByte(255);      
        if(Testdata==0XAB)return 0;
    }
    return 1;                                              
}

调用

    if(AT24C02_Test()==0)  //检测通过
    {
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14, GPIO_PIN_RESET);
        HAL_Delay(2000);
    }
            AT24CXX_WriteByte(0x0001,0xA2);
            HAL_Delay(50);
            i = AT24CXX_ReadByte(0x0001);
          i = i+1;
            if(0xA3== i)
            HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14);
            HAL_Delay(500);

 

posted @ 2020-09-28 15:09  流水江湖  阅读(2257)  评论(0编辑  收藏  举报