一.前言
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的庫函數實現通信,代碼實現量小,調通以后的穩定性高,速度快。缺點是可能會占一部分內存空間,調試不方便,因為都是用的庫函數,不容易找問題。
上一篇:STM8的GPIO各模式
下一篇:DS18B20時序分析詳細步驟
推薦閱讀
史海拾趣