關於STM32使用硬件i2c讀寫AT24C256實驗遇到的問題

硬件環境:XNUCLEO開發板(STM32F411RCT6芯片)、MiniSTM32 V3.41開發板(STM32F103RCT6芯片)

軟件環境:IAR for ARM 8.30.1、Keil5

現將工程代碼附上:

stm32f1xx鏈接:https://download.csdn.net/download/u011727389/10935701

stm32f4xx鏈接:https://download.csdn.net/download/u011727389/10935673

下面介紹我做的幾個實驗:

一、軟件模擬i2c實驗

1、在ministm32開發板軟件模擬i2c協議讀寫at24c02沒有問題,也就是正點原子官方給的例子

2、分爲下面兩個步驟

a)在ministm32開發板,用開發板PB0、PB1分別接at24c256模塊的SCL、SDA引腳,at24c256模塊的VCC、GND接開發板的BOOT模塊的3.3V、GND

b)將正點原子i2c實驗的程序中EE_TYPE改成AT24C256,發現邏輯分析儀還是抓不到波形,按道理軟件GPIO模擬i2c時序,比如,對於讀操作,先要一個起始信號,發送從設備地址,發送需要讀eeprom的地址,再接收需要讀的數據(此時GPIO爲輸入模式),再發送停止信號。GPIO上的對應端口是有電壓變化的,是應該可以抓到波形的,但卻沒抓到,那就應該分析GPIO端口配置是否有問題,對於stm32f1xx看寄存器GPIOX_CRL、GPIOX_CRH、AFIO。由於stm32f1xx有5組GPIO(A- E),每組16個端口(PX0-PX15),所以會有高低兩個寄存器來配置這16個端口的上下拉。輸入輸出模式;對於AFIO,由於AFIO默認值是0,故如果選擇的是使用默認複用端口,則不用配置,下面會介紹。

          

          對照上圖所示正確配置後(如果使用i2c1的PB6/7端口的話則不需要配置AFIO_MARP,因爲默認值是0)stm32f1xx的i2c讀 寫功能正常了。

          對於stm32f4xx需要看GPIOX_MODER、GPIOX_PUPDR、GPIOX_AFRL、GPIOX_AFRH,把這幾個寄存器配置正確,i2c讀寫也正常了。

二、使用i2c控制器

1、在ministm32開發板用st公司的例子做修改(上面stm32f1xx鏈接),將其解壓放在en.stm32cubef1 V1.7.0-》Projects-》STM32F103RB-Nucleo-》Examples-》I2C目錄下,做實驗發現可以讀寫,但邏輯分析儀抓到的讀波形不正確。寫波形的設備地址也不對。

at24c256的設備地址datasheet寫的是MSB-》LSB:1 0 1 0 0 A1 A2 R/W,對於實驗設置A1、A2爲0,那麼設備地址應該爲0xA0,怎麼會變成0x50,而0x50正好是右移一位的結果,這是想到了邏輯分析儀i2c設置的參數,選擇了7-bit address bits only,所以抓出來是0x50,改過來就正確了,這個不影響抓到的數據。

對於讀數據不對問題,仔細研讀了軟件模擬i2c時序,發現發送讀寫地址是一個16bit的數據,對照datasheet發現也是要求16bit地址,將8bit地址改成16bit地址之後發現寫讀數據比對通過。

2、在Xnueleo開發板用st公司的例子做修改(上面stm32f4xx鏈接),將其解壓放在en.stm32cubef4 V1.23.0-》Projects-》STM32F411RE-Nucleo-》Examples_MIX-》I2C目錄下,做實驗發現可以讀寫,但邏輯分析儀抓不到波形,程序卡在了寫完DR寄存器等待ADDR_FLAG上,都是官方例子改的,check double了代碼沒有問題,然後檢查兩個開發板之間和i2c通信模塊at24c256的連接上,發現除了VCC有點差別其他無,這是重點在VCC上了一個是3.3v,一個是E5V,發現at24c256電壓範圍是2.7-5.5v,說明不是壓值問題,然後仔細看Xncleo板子的E5V,將其連接到下載器的5v上,這肯定有電壓,發現讀寫正常了,然後諮詢並看了原理圖,說明書發現E5V是外部電壓,不是產生5v電壓,真相終於大白,竟然是這麼二的問題。。。這也提醒一定要仔細看手冊。

 

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