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);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM