概述
雖然STM32的硬件IIC據(jù)說有設計缺陷,但是經(jīng)過我的實踐,至少STM32F103的硬件IIC是沒問題的。這里給出STM32的硬件IIC的使用以及編程思路。
1.STM32硬件IIC引腳
在這里給出STM32F103的硬件IIC引腳,方便查閱使用
2.STM32硬件IIC使用流程
STM32的硬件IIC我認為是非常具有借鑒意義的,它使用了事件組的一個流程。以stm32為主設備,iic設備為從設備為例,主設備需要先向從設備發(fā)送開始信號,這個是iic協(xié)議所規(guī)定的,之后iic總線上的應答信號會轉化成EV5事件(一個標志量)。沒錯,STM32把一次完整的IIC數(shù)據(jù)傳輸依據(jù)IIC總線上的應答給拆分成了5個事件,每個事件代表一個傳輸事件完成。這是我第一次在freertos外的設備上見到事件組。
如圖所示,在STM32上,硬件IIC事件組共有9個,在以STM32為主設備的情況下,僅有5個事件需要注意。其中EV5代表IIC模式設置完成,EV6代表IIC發(fā)送或接收模式設置,EV7代表IIC接收完成,EV8代表發(fā)送中,EV8_2代表發(fā)送完成。文章來源:http://www.zghlxwxcb.cn/news/detail-839517.html
具體代碼實現(xiàn)
在這里以STM32上的IIC1為例文章來源地址http://www.zghlxwxcb.cn/news/detail-839517.html
IIC初始化
1.IIC以及GPIO時鐘使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//打開GPIO時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);//打開IIC時鐘
2.GPIO設置
GPIO_InitTypeDef IIC_Gpio;//定義GPIO結構體
IIC_Gpio.GPIO_Pin |= GPIO_Pin_6 | GPIO_Pin_7;//設置IIC引腳
IIC_Gpio.GPIO_Mode = GPIO_Mode_AF_OD;//設置GPIO模式為復用推挽輸出
IIC_Gpio.GPIO_Speed = GPIO_Speed_50MHz;//設置GPIO速度為50MHz
GPIO_Init(GPIOB,&IIC_Gpio);//載入GPIO結構體
3.IIC設置
I2C_DeInit(I2C1);//初始化IIC1
I2C_InitTypeDef IIC_InitStruct;//定義IIC結構體
IIC_InitStruct.I2C_ClockSpeed = 400000;//設置IIC時鐘為400KHz,STM32硬件IIC最大到400KHz
IIC_InitStruct.I2C_Mode = I2C_Mode_I2C;//設置IIC模式為I2C
IIC_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2;//設置IIC占空比為2
IIC_InitStruct.I2C_OwnAddress1 = 0x21;//設置IIC本機地址,可以隨意設置,只要不與要通信的設備沖突即可
IIC_InitStruct.I2C_Ack = I2C_Ack_Enable;//設置IIC應答
IIC_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;//設置IIC應答地址長度
I2C_Init(I2C1,&IIC_InitStruct);//載入IIC結構體
4.IIC使能
I2C_Cmd(I2C1,ENABLE);
IIC發(fā)送
IIC發(fā)送單字節(jié)
I2C_GenerateSTART(I2C1,ENABLE);//生成開始信號
IIC_WaitEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT);//等待IIC模式設置開始即EV5事件
I2C_Send7bitAddress(I2C1,Address,I2C_Direction_Transmitter);//發(fā)送從設備地址+讀寫位
IIC_WaitEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);//等待IIC模式設置完成即EV6事件
I2C_SendData(I2C1,data);//發(fā)送數(shù)據(jù)
IIC_WaitEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED);//等待數(shù)據(jù)發(fā)送完成即EV8_2事件
I2C_GenerateSTOP(I2C1,ENABLE);//生成停止信號
IIC發(fā)送多字節(jié)
void IIC_SendBuff(uint8_t* str,uint16_t len)
{
I2C_GenerateSTART(I2C1,ENABLE);//生成開始信號
IIC_WaitEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT);//等待IIC模式設置開始即EV5事件
I2C_Send7bitAddress(I2C1,Address,I2C_Direction_Transmitter);//發(fā)送從設備地址+讀寫位
IIC_WaitEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);//等待IIC模式設置完成即EV6事件
while(len--)循環(huán)發(fā)送數(shù)據(jù)
{
I2C_SendData(I2C1,*str);
str++;
IIC_WaitEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED);
}
I2C_GenerateSTOP(I2C1,ENABLE);//生成停止信號
}
到了這里,關于STM32硬件IIC使用的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!