最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

STM32F103的硬件I2C調(diào)試記錄

2020-09-14 17:17 作者:奧大梨呀  | 我要投稿

????提到I2C協(xié)議,搞嵌入式的朋友肯定不陌生,它是一種半雙工的串行同步通信協(xié)議。通信速率通常分為標(biāo)準(zhǔn)模式(100Kbit/S)和快速模式(400Kbits/S)。筆者在學(xué)習(xí)51單片機(jī)操作AT24C02這個(gè)EEPROM的時(shí)候第一次接觸到I2C協(xié)議,因?yàn)閭鹘y(tǒng)的89C51并不帶有I2C控制器,因此只能使用IO模擬的方式來驅(qū)動(dòng)I2C器件。

????筆者后來學(xué)習(xí)STM32的時(shí)候,因老師說STM32F1的硬件I2C不好用,因此在以后很長一段時(shí)間筆者在驅(qū)動(dòng)I2C器件時(shí)都是采用IO模擬的方式。網(wǎng)絡(luò)上也有很多朋友采用IO模擬的方式,理由大多是因?yàn)镮O模擬的方式穩(wěn)定、便于移植等。最近,筆者突然打算研究一下STM32F1的硬件I2C,畢竟對(duì)于CM3內(nèi)核的單片機(jī),甚至是CM4、CM7內(nèi)核的單片機(jī),這樣的高性能單片機(jī)使用IO模擬的方式來驅(qū)動(dòng)I2C器件太浪費(fèi)CPU的性能了。

????這次筆者的實(shí)驗(yàn)平臺(tái)是STM32F103RCT6這塊MCU,其中驅(qū)動(dòng)的I2C器件是NXP的一款I(lǐng)2C接口的RTC芯片——PCF8563,連接到STM32F103RCT6的PB11(I2C2_SDA)和PB10(I2C2_SCL),板子是筆者團(tuán)隊(duì)自己畫的,就是先前視頻(BV1PA411i7Sx)里驅(qū)動(dòng)數(shù)碼管的那塊板子。

????由于筆者是第一次使用STM32的硬件I2C,因此就暫時(shí)采用輪詢的方式,并沒有采用中斷或者DMA的方式了。

????要使用STM32的硬件I2C,首先需要對(duì)I2C控制器進(jìn)行初始化,這里筆者為了提高代碼的可重用性,提前構(gòu)思好了一個(gè)框架,將I2C驅(qū)動(dòng)進(jìn)行了一個(gè)封裝:

1.首先是I2C初始化結(jié)構(gòu)體,包含了一個(gè)I2C控制器初始化參數(shù)的一些信息。

????

????????然后編寫一個(gè)函數(shù)根據(jù)這個(gè)結(jié)構(gòu)體的信息對(duì)I2C控制器進(jìn)行初始化:

2.然后是I2C的數(shù)據(jù)傳輸,也使用結(jié)構(gòu)體進(jìn)行了一個(gè)封裝。

這個(gè)封裝的思路其實(shí)是筆者從Linux的I2C驅(qū)動(dòng)的I2C數(shù)據(jù)傳輸中模仿而來的。所有的數(shù)據(jù)傳輸函數(shù)的形式參數(shù)只有一個(gè),就是這個(gè)I2C_TransferType結(jié)構(gòu)體指針類型。

至此I2C主機(jī)控制器層就搭建完畢了。

然后是PCF8563的驅(qū)動(dòng),為了方便操作時(shí)間,同樣也構(gòu)建了一個(gè)用來表示時(shí)間的結(jié)構(gòu)體:

而PCF8563層就是調(diào)用I2C層的讀寫API對(duì)其寄存器進(jìn)行操作了。

比如,往PCF8563寫入時(shí)間的API:

最終則是在uCOS-III操作系統(tǒng)創(chuàng)建的一個(gè)線程中每隔500ms讀取一次時(shí)間在數(shù)碼管上顯示出來(數(shù)碼管驅(qū)動(dòng)就是先前視頻中的那個(gè)DMA+定時(shí)器的驅(qū)動(dòng))。

????以上是筆者在進(jìn)行程序開發(fā)時(shí)的思路,但是STM32F103的硬件I2C不是那么好掌控的,筆者在調(diào)試過程中也是遇到了很多問題。

????程序剛剛編譯通過第一次運(yùn)行時(shí),上電運(yùn)行直接死機(jī)。注意,筆者使用了RTOS,如果只是因?yàn)镽TC線程中I2C讀取某個(gè)標(biāo)志位時(shí)卡在了while中,并不會(huì)影響其他線程,LED還是會(huì)閃。但是LED也滅了,在線debug的時(shí)候發(fā)現(xiàn)程序最終是進(jìn)入了HardFault_Handler,說明I2C里某些操作導(dǎo)致STM32硬件錯(cuò)誤。

????最終在ST的官方手冊(cè)中找到了原因,在I2C讀取最后1字節(jié)數(shù)據(jù)前,應(yīng)該先設(shè)置非應(yīng)答和停止信號(hào),然后再去讀數(shù)據(jù),筆者一開始是將這兩步按正常的I2C協(xié)議放在了最后。

????之后又修改了一些筆者拷貝相同代碼時(shí),粗心導(dǎo)致的一些變量忘記修改,比如txlen在接收函數(shù)中忘記改成了rxlen。

????經(jīng)過了兩三天的搭建和調(diào)試,總算是把STM32的硬件I2C搞定了,采用的是輪詢的方式,日后看找個(gè)時(shí)間試試中斷或者DMA的方式吧。這個(gè)I2C和PCF8563的代碼我會(huì)在文末貼出來供大家參考,寫的不好的地方也請(qǐng)批評(píng)指正。

????最后總結(jié)一下STM32F1的硬件I2C,據(jù)網(wǎng)友說,ST為了規(guī)避專利問題,將I2C控制器復(fù)雜化了,而且STD庫貌似也有些許BUG,但還是可以用的(不然ST就不會(huì)發(fā)布這款芯片了)。對(duì)于F1的硬件I2C,貌似還有其他毛病,比如通信速率不能過快、不能被打斷等。筆者在PCF8563驅(qū)動(dòng)中使用的400KHz的通信速率,目前并沒有發(fā)現(xiàn)異常,但長期來看也不好說,指不定什么時(shí)候卡死了呢。至于不能被打斷,筆者在驅(qū)動(dòng)中使用RTOS提供的關(guān)中斷的方式來確保I2C讀寫過程連續(xù)不被打斷。如果采用STM32F1的方案且使用到I2C器件的話,為了穩(wěn)定性,推薦還是使用IO模擬的方式吧,至少容錯(cuò)率高。


代碼鏈接:

https://pan.baidu.com/s/155xub7hBSiYXG7fi-tB--A?

提取碼:u8ng


STM32F103的硬件I2C調(diào)試記錄的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
南部县| 北辰区| 灵丘县| 海城市| 威远县| 普兰店市| 仁怀市| 白城市| 夏邑县| 武清区| 弋阳县| 九寨沟县| 任丘市| 陵川县| 枣庄市| 通海县| 柘荣县| 黎平县| 福海县| 成武县| 乐至县| 祁连县| 长白| 大名县| 准格尔旗| 庐江县| 四会市| 昆山市| 鹤山市| 皋兰县| 齐河县| 秦皇岛市| 西和县| 大安市| 丰宁| 上思县| 云霄县| 霍城县| 徐州市| 织金县| 象山县|