淺談STM8S(1)——I2C配置

前幾天使用STM8S103K3調AT24C256,用到它的硬件I2C,遇到不少問題,查了很多資料,終於是調通了。

以下是以標準模式(即100KHz)的設置爲主的I2C初始化配置的一些問題。


(1)I/O的配置問題。


無需對I/O口引腳處理。


如果I2C的兩個接口引腳在事先沒有被用作其他用途,仍保持着復位後默認狀態,則不需要對其處理。

因爲使用硬件I2C時,其對應的兩個接口引腳需要被配置爲浮空輸入,而初始復位時,所有引腳均被設置爲浮空輸入。

即Px_CR1復位值爲0x00


(2)I2C時鐘頻率等配置


I2C_FREQR = 系統時鐘頻率(單位:MHz)

I2C_TRISER = I2C_FREQR + 1

I2C_CCR = 系統時鐘頻率  / (I2C輸出頻率 * 2)(單位:Hz)


I2C_FREQR 爲I2C模塊的輸入時鐘頻率,一般即爲時鐘頻率,注意單位爲MHz,即如果系統時鐘爲16MHz,

I2C_FREQR = 0x10


I2C_TRISER 本意爲主模式時的最大上升時間,與I2C_FREQR有關。

標準模式中SCL最大允許的上升時間爲1000ns,那麼Tpclk1 = 1000 / I2C_FREQR,而I2C_TRISER = 1000ns / Tpclk1 + 1

雖然這裏的式子有點繞,但最終得結果其實很簡單,就是I2C_FREQR + 1而已。


I2C_CCR 時鐘控制,標準模式中,Thigh = CCR * Tck;Tlow = CCR * Tck;I2C通信頻率fscl = 1/(Thigh + Tlow);

即100KHz = 1 / ( 2 * CCR * Tpclk1 );Tpclk1在上面以介紹,Tpclk1 = 1000 / I2C_FREQR,通過化簡最終可得到

I2C_CCR = 系統時鐘頻率  / (I2C輸出頻率 * 2)(單位:Hz)


(3)初始化I2C


以STM8S103K3爲例,時鐘頻率16MHz,I2C標準模式100KHz,初始化函數:

void IIC_Init(void)
{

I2C_CR1    = 0x00; //禁止I2C外設
I2C_FREQR |= 0x10; //輸入時鐘頻率16M

I2C_TRISER = 0x11; //0x10 + 1
I2C_CCRL   = 0x50; //16M / 100K / 2
I2C_CCRH   = 0x00; 

I2C_CR1   |= 0x01; //開啓I2C外設

I2C_CR2   |= 0x04; //應答使能

I2C_OARL   = 0x50; //自身地址
I2C_OARH   = 0x00;


}
在初始化前需先關閉I2C功能,禁止其使用,在那寄存器配置完後才使能I2C。手冊上寫的是必須禁止了才能寫一些寄存器。

雖然復位後I2C就是被禁止的。但一些歷程裏面,復位PE一般會寫在I2C_FREQR配置的後面,程序仍能使用,不明白爲什麼。

自身地址,若不需要就忽略吧,這個可寫在I2C使能之後。



關於STM8S的I2C初始化配置,鄙人的淺談就到此結束,若有時間功夫,會補上I2C的使用問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章