新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32 硬件I2C EEPROM命令解析

        STM32 硬件I2C EEPROM命令解析

        作者: 時間:2016-11-21 來源:網絡 收藏
        void I2C_EE_BufferWrite(u8* pBuffer, u8 WriteAddr, u16 NumByteToWrite)
        {
        u8 NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0;
        //寫入地址是每頁的第幾位
        Addr = WriteAddr % I2C_PageSize;
        //在開始的一頁要寫入的個數
        count = I2C_PageSize - Addr;
        //要寫入的頁數
        NumOfPage = NumByteToWrite / I2C_PageSize;
        //不足一頁的個數
        NumOfSingle = NumByteToWrite % I2C_PageSize;
        //EEPROM設為待命狀態
        I2C_EE_WaitEepromStandbyState();
        //寫入地址是頁的開始
        if (Addr == 0)
        {
        //數據小于一頁
        if (NumOfPage == 0)
        {
        //寫少于一頁的數據
        I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);
        //EEPROM設為待命狀態
        I2C_EE_WaitEepromStandbyState();
        }
        //數據大于等于一頁
        else
        {
        while (NumOfPage--)//要寫入的頁數
        {
        //寫一頁的數據
        I2C_EE_PageWrite(pBuffer, WriteAddr, I2C_PageSize);
        //EEPROM設為待命狀態
        I2C_EE_WaitEepromStandbyState();
        WriteAddr += I2C_PageSize;
        pBuffer += I2C_PageSize;
        }
        //剩余數據小于一頁
        if (NumOfSingle!=0)
        {
        //寫少于一頁的數據
        I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);
        //EEPROM設為待命狀態
        I2C_EE_WaitEepromStandbyState();
        }
        }
        }
        //寫入地址不是頁的開始
        else
        {
        //數據小于一頁
        if (NumOfPage== 0)
        {
        //寫少于一頁的數據
        I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);
        //EEPROM設為待命狀態
        I2C_EE_WaitEepromStandbyState();
        }
        //數據大于等于一頁
        else
        {
        NumByteToWrite -= count;
        //重新計算要寫入的頁數
        NumOfPage = NumByteToWrite / I2C_PageSize;
        //重新計算不足一頁的個數
        NumOfSingle = NumByteToWrite % I2C_PageSize;
        if (count != 0)
        {
        //將開始的空間寫滿一頁
        I2C_EE_PageWrite(pBuffer, WriteAddr, count);
        //EEPROM設為待命狀態
        I2C_EE_WaitEepromStandbyState();
        WriteAddr += count;
        pBuffer += count;
        }
        //要寫入的頁數
        while (NumOfPage--)
        {
        //寫一頁的數據
        I2C_EE_PageWrite(pBuffer, WriteAddr, I2C_PageSize);
        //EEPROM設為待命狀態
        I2C_EE_WaitEepromStandbyState();
        WriteAddr += I2C_PageSize;
        pBuffer += I2C_PageSize;
        }
        //剩余數據小于一頁
        if (NumOfSingle != 0)
        {
        //寫少于一頁的數據
        I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);
        //EEPROM設為待命狀態
        I2C_EE_WaitEepromStandbyState();
        }
        }
        }
        }
        void I2C_EE_ByteWrite(u8* pBuffer, u8 WriteAddr)
        {
        //產生 I2C2傳輸 START條件
        I2C_GenerateSTART(I2C2, ENABLE);
        //通過START的產生,確定主機模式是否成功(檢測EV5)
        while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
        //發送器件地址(寫)
        I2C_Send7bitAddress(I2C2, EEPROM_ADDRESS, I2C_Direction_Transmitter);
        //檢測主機傳輸模式是否成功(檢測EV6)
        while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
        //通過外設 I2C2發送地址
        I2C_SendData(I2C2, WriteAddr);
        //檢測主機發送的字節是否成功(檢測EV8)
        while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
        //通過外設 I2C2發送數據
        I2C_SendData(I2C2, *pBuffer);
        //檢測主機發送的字節是否成功(檢測EV8)
        while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
        //產生 I2C2傳輸 STOP條件
        I2C_GenerateSTOP(I2C2, ENABLE);
        }
        void I2C_EE_PageWrite(u8* pBuffer, u8 WriteAddr, u8 NumByteToWrite)
        {
        //產生 I2C2傳輸 START條件
        I2C_GenerateSTART(I2C2, ENABLE);
        //通過START的產生,確定主機模式是否成功(檢測EV5)
        while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
        //發送器件地址(寫)
        I2C_Send7bitAddress(I2C2, EEPROM_ADDRESS, I2C_Direction_Transmitter);
        //檢測主機傳輸模式是否成功(檢測EV6)
        while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
        //通過外設 I2C2發送地址
        I2C_SendData(I2C2, WriteAddr);
        //檢測主機發送的字節是否成功(檢測EV8)
        while (! I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
        //寫數據
        while (NumByteToWrite--)
        {
        //通過外設 I2C2發送數據
        I2C_SendData(I2C2, *pBuffer);
        //指針++
        pBuffer++;
        //檢測主機發送的字節是否成功(檢測EV8)
        while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
        }
        //產生 I2C2 傳輸 STOP條件
        I2C_GenerateSTOP(I2C2, ENABLE);
        }
        void I2C_EE_BufferRead(u8* pBuffer, u8 ReadAddr, u16 NumByteToRead)
        {
        //EEPROM設為待命狀態
        I2C_EE_WaitEepromStandbyState();
        //產生 I2C2傳輸 START條件
        I2C_GenerateSTART(I2C2, ENABLE);
        //通過START的產生,確定主機模式是否成功(檢測EV5)
        while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
        //在一個單一的數據傳輸情況下讀取數據之前禁用的ACK
        if (NumByteToRead==1)
        {
        I2C_AcknowledgeConfig(I2C2, DISABLE);//失能I2C2 的應答功能
        }
        //向指定的從 I2C設備傳送地址字,選擇發送方向
        I2C_Send7bitAddress(I2C2, EEPROM_ADDRESS, I2C_Direction_Transmitter);
        //檢測主機傳輸模式是否成功(檢測EV6)
        while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
        //使能I2C外設
        I2C_Cmd(I2C2, ENABLE);
        //通過外設 I2C2發送地址
        I2C_SendData(I2C2, ReadAddr);
        //檢測主機發送的字節是否成功(檢測EV8)
        while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
        //產生 I2C2 傳輸 START條件
        I2C_GenerateSTART(I2C2, ENABLE);
        //通過START的產生,確定主機模式是否成功(檢測EV5)
        while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT));
        //向指定的從 I2C設備傳送地址字,選擇接收方向
        I2C_Send7bitAddress(I2C2, EEPROM_ADDRESS, I2C_Direction_Receiver);
        //檢測主機接收模式是否成功(檢測EV6)
        while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
        //讀取數據
        while (NumByteToRead)
        {
        //檢測主機接收的字節是否成功(檢測EV8)
        if (I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_RECEIVED))
        {
        if (NumByteToRead == 2)
        {
        //使能或者失能指定 I2C的應答功能
        I2C_AcknowledgeConfig(I2C2, DISABLE);
        }
        if (NumByteToRead == 1)
        {
        //產生 I2C2 傳輸 STOP條件
        I2C_GenerateSTOP(I2C2, ENABLE);
        }
        //返回通過 I2C2最近接收的數據
        *pBuffer = I2C_ReceiveData(I2C2);
        //指向下個地址
        pBuffer++;
        NumByteToRead--;
        }
        }
        //使能I2C2 的應答功能
        I2C_AcknowledgeConfig(I2C2, ENABLE);
        }
        void I2C_EE_WaitEepromStandbyState(void)
        {
        vu16 SR1_Tmp = 0;
        do
        {
        //產生 I2C2傳輸 START條件
        I2C_GenerateSTART(I2C2, ENABLE);
        //讀取指定的 I2C寄存器 I2C_SR1 并返回其值
        SR1_Tmp = I2C_ReadRegister(I2C2, I2C_Register_SR1);
        //向指定的從 I2C設備傳送地址字 ,選擇發送方向
        I2C_Send7bitAddress(I2C2, EEPROM_ADDRESS, I2C_Direction_Transmitter);
        } while (!(I2C_ReadRegister(I2C2, I2C_Register_SR1) & 0x0002));//地址發送結束
        //清除 I2Cx的應答錯誤標志位
        I2C_ClearFlag(I2C2, I2C_FLAG_AF);
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 民勤县| 山东省| 连江县| 色达县| 怀化市| 宾川县| 江西省| 重庆市| 蚌埠市| 桐柏县| 九龙坡区| 金平| 仙居县| 开鲁县| 泗洪县| 葫芦岛市| 华安县| 光泽县| 怀来县| 财经| 三亚市| 阳西县| 安图县| 综艺| 大姚县| 宁海县| 镇康县| 宁波市| 张掖市| 沂源县| 岳普湖县| 新郑市| 静海县| 宣恩县| 阿图什市| 普兰店市| 宜都市| 乐山市| 浪卡子县| 肃北| 广河县|