stm8的IIC庫的使用


一.前言

       stm8是一款低功耗的MCU芯片,它具備stm32庫函數和資源豐富的優勢。也同時具有價格便宜,低功耗的特點。在一些項目中,能起到很好的作用。下面我介紹一下stm8的IIC硬件庫函數驅動代碼及實現。

二.IIC基本操作

       iic基本操作分為讀操作和寫操作,這兩個操作就可以對設備進行一些基本的操作了。還要知道設備的地址就ok了,具體的IIC時序大家可以上網看看。

三.實現代碼

   1.先要啟動IIC的時鍾,保證可以正常工作。 CLK_PeripheralClockConfig (CLK_Peripheral_I2C1,ENABLE);//開啟IIC1時鍾

   2.再對IIC進行初始化的操作

        void Init(void)

      {

        I2C_DeInit(I2C1);
       I2C_Init(I2C1,IICSPEED, host_address, I2C_Mode_I2C,I2C_DutyCycle_2, I2C_Ack_Enable, I2C_AcknowledgedAddress_7bit);
       I2C_Cmd(I2C1,ENABLE);
      }

     可以用來對IIC的通信時間和主機地址以及從機地址等參數進行設置。IICSPEED最好不要超過400K,會造成通信的不穩定,最好在100K左右就可以了,host_address是主機的地址,可以自己設定。

  3.IIC的寫操作

    

/****************************************************************************
* 名稱:I2C_WriteByte(uint8_t addr,uint8_t data)
* 功能:進行IIC的寫操作。
* 入口參數: uint8_t addr 寄存器的地址
* uint8_t data 寫入的數據
* 出口參數:無
* 說明:對觸摸屏的寄存器進行寫入操作,變量都是16進制
****************************************************************************/

void I2C_WriteByte(uint8_t addr,uint8_t data)
{

while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); //等待空閑

I2C_GenerateSTART(I2C1, ENABLE);//開啟I2C1
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*/

I2C_Send7bitAddress(I2C1, I2C1_WRITE_ADDRESS7, I2C_Direction_Transmitter);//器件地址 -- 默認0xD0
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

I2C_SendData(I2C1, addr);//寄存器地址
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

I2C_SendData(I2C1, data);//發送數據
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_AcknowledgeConfig(I2C1,ENABLE);

I2C_GenerateSTOP(I2C1, ENABLE);//關閉I2C1總線
}

上面的代碼是IIC的寫函數,可以對設備的寄存器進行寫操作。I2C1_WRITE_ADDRESS7代表設備IIC的寫入地址,根據器件地址的不同改變就可以。每一步都是調用的IIC的庫函數,如果進行單步調試,地址寄存器都對的話,就可以看見每操作一步從機都會有一個應答信號。

4.IIC的讀操作

/****************************************************************************
* 名稱:uint8_t I2C_ReadByte(uint8_t addr)
* 功能:進行IIC的讀操作。
* 入口參數: uint8_t addr 寄存器的地址
* 出口參數: uint8_t i 保存讀到的數據並作為參數返回
* 說明:對觸摸屏的寄存器進行讀出操作,變量都是16進制,IIC寫操作要
先寫寄存器再進行讀寄存器的操作,否則會失敗
****************************************************************************/
uint8_t I2C_ReadByte(uint8_t addr)
{
uint8_t i;

while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));

I2C_GenerateSTART(I2C1, ENABLE);//開啟I2C1
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*/

I2C_Send7bitAddress(I2C1, I2C1_WRITE_ADDRESS7, I2C_Direction_Transmitter);//器件地址 -- 默認0xD0
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));

I2C_SendData(I2C1, addr);//寄存器地址
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));



I2C_GenerateSTART(I2C1, ENABLE);//開啟I2C1
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*/

I2C_Send7bitAddress(I2C1, I2C1_READ_ADDRESS7, I2C_Direction_Receiver);//器件地址 -- 默認0xD1
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));


while (!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED));

i=I2C_ReceiveData(I2C1);//讀取數據

I2C_AcknowledgeConfig(I2C1,DISABLE);

I2C_GenerateSTOP(I2C1, ENABLE);//關閉I2C1總線


return i;

}

IIC的讀操作,跟寫操作不同的是.讀操作首先要先進行寫操作,寫一下要讀的寄存器地址,當然地址也要發送寫入的地址。然后再寫入器件讀取地址,要讀取的寄存器地址,把數據讀取出來。I2C1_READ_ADDRESS7為器件的讀取地址,寫操作和讀操作兩個操作的應答變量也不一樣,這個要注意一下。

四.總結

硬件IIC的庫函數實現通信,代碼實現量小,調通以后的穩定性高,速度快。缺點是可能會占一部分內存空間,調試不方便,因為都是用的庫函數,不容易找問題。


免責聲明!

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



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