前幾天使用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的使用問題。