21.4.2.8
EEPROM讀取函數
從EEPROM讀取數據是一個復合的I2C時序,它實際上包含一個寫過程和一個讀過程,見圖22_18。

圖22?18 EEPROM數據讀取時序
讀時序的第一個通訊過程中,使用I2C發送設備地址尋址(寫方向),接著發送要讀取的“內存地址”;第二個通訊過程中,再次使用I2C發送設備地址尋址,但這個時候的數據方向是讀方向;在這個過程之后,EEPROM會向主機返回從“內存地址”開始的數據,一個字節一個字節地傳輸,只要主機的響應為“應答信號”,它就會一直傳輸下去,主機想結束傳輸時,就發送“非應答信號”,并以“停止信號”結束通訊,作為從機的EEPROM也會停止傳輸。FSP庫已經幫我們實現了這一個過程,我們只是簡單封裝一下就可以直接使用,實現代碼見代碼清單22_6。
列表6:代碼清單22_6:EEPROM讀取函數
/*** @brief 讀取 I2C EEPROM 數據* @param* @arg ptr_read: 讀取緩沖區指針* @arg address: 地址* @arg byte: 讀取的字節數* @retval 無*/voidI2C_EE_BufferRead(unsignedchar* ptr_read,unsignedchar address,→unsignedchar byte){unsignedchar send_buffer[2] = {};unsignedchar read_buffer[1] = {};send_buffer[0] = address;R_IIC_MASTER_Write(&EEPROM_ctrl, &send_buffer[0], 1, true);while ((I2C_MASTER_EVENT_TX_COMPLETE != g_i2c_callback_event) && timeout_→ms){R_BSP_SoftwareDelay(400U, BSP_DELAY_UNITS_MICROSECONDS);timeout_ms--;}timeout_ms = 500;R_BSP_SoftwareDelay(250U, BSP_DELAY_UNITS_MICROSECONDS);R_IIC_MASTER_Read(&EEPROM_ctrl, ptr_read, byte, false);}
這個函數是在指定的地址讀取一個字節的數據,第一個變量EEPROM的地址,最后會返回一個整型的數據。如果不想使用printf函數可以將其進行注釋,但需要適當增加延時時間。這里代碼非常簡單,我們只需要確定I2C的地址、數據格式、數據存儲指針、數據大小、超時設置,就可以把想要的數據讀回來。

21.4.2.9
EEPROM測試函數
列表7:代碼清單22_7:EEPROM測試函數
/*** @brief I2C(AT24C02) 讀寫測試* @param 無* @retval 正常返回 1 ,不正常返回 0*/uint8_tI2C_Test(void){uint16_t i;unsignedchar DATA_Size = 30;unsignedchar I2c_Buf_Write[33] = {};unsignedchar I2c_Buf_Read[33] = {};//將 I2c_Buf_Write 中順序遞增的數據寫入 EERPOM 中printf("寫入的數據\r\n");for ( i=0; i<DATA_Size; i++ ) { //填充緩沖I2c_Buf_Write[i] =i;printf("0x%02X ", I2c_Buf_Write[i]);if (i%16 == 15)printf("\n");}I2C_EE_BufferWrite( I2c_Buf_Write, 0x00 , DATA_Size);//將 EEPROM 讀出數據順序保持到 I2c_Buf_Read 中printf("\r\n讀出的數據\n");R_BSP_SoftwareDelay(10U, BSP_DELAY_UNITS_MILLISECONDS);I2C_EE_BufferRead(I2c_Buf_Read, 0x00 , DATA_Size);//將 I2c_Buf_Read 中的數據通過串口打印R_BSP_SoftwareDelay(10U, BSP_DELAY_UNITS_MILLISECONDS);for (i=0; i<DATA_Size; i++) {if (I2c_Buf_Read[i] != I2c_Buf_Write[i]) {printf("0x%02X \n", I2c_Buf_Read[i]);printf("錯誤:I2C EEPROM 寫入與讀出的數據不一致\n");printf("%d\n",i);return0;}printf("0x%02X ", I2c_Buf_Read[i]);if (i%16 == 15)printf("\n");}printf("\r\nI2C(AT24C02) 讀寫測試成功\n");return1;}
21.4.2.10
主函數
列表8:代碼清單22_8:主函數
voidhal_entry(void){I2C_EE_Init();Debug_UART4_Init();printf("歡迎使用野火 RA6M5 開發板。\r\n");printf("這是一個 I2C 外設 (AT24C02) 讀寫測試例程 \r\n");R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);while (1){I2C_EE_Writedrase();if (I2C_Test() ==1) {LED_GREEN;} else {LED_RED;}while(1);}/* Enter non-secure code */R_BSP_NonSecureEnter();}
下載驗證
保證開發板相關硬件連接正確,用Type-C線連接開發板“USB TO UART”接口跟電腦,在電腦端打開串口調試助手,把編譯好的程序下載到開發板,此時串口調試助手即可收到開發板發過來的數據。在串口調試助手可看到EEPROM測試的調試信息。如下圖所示:

第22章
SPI——OLED屏幕顯示
RA芯片的SPI分為簡單SPI和普通SPI,簡單SPI就是SCI模塊(Serial Communications Interface)中的SPI模式,它是使用串行總線來模擬SPI,而我們本章我們所要學習的是普通的SPI,是全功能的SPI,它在RA芯片內部實際存在的一個硬件SPI控制器模塊。
SPI協議
SPI協議是由摩托羅拉公司提出的通訊協議(Serial Peripheral Interface),即串行外圍設備接口,是一種高速全雙工的通信總線。它被廣泛地使用在ADC、LCD等設備與MCU間,要求通訊速率較高的場合。
在瑞薩RA6M5芯片中,SPI外設可用作通訊的主機及從機,數據傳輸可達到最大的50Mbps速率,信號允許通過SPI操作(4線方法)或時鐘同步操作(3-線方法),支持事件鏈接功能,并具有數據校驗功能。
下面我們分別對SPI協議的物理層及協議層進行講解。
如您在使用瑞薩MCU/MPU產品中有任何問題,可識別下方二維碼或復制網址到瀏覽器中打開,進入瑞薩技術論壇尋找答案或獲取在線技術支持。
https://community-ja.renesas.com/zh/forums-groups/mcu-mpu/
未完待續
推薦閱讀
EEPROM頁寫入與讀取函數——瑞薩RA系列FSP庫開發實戰指南(68)
I2C讀寫EEPROM實驗——瑞薩RA系列FSP庫開發實戰指南(67)

時鐘控制邏輯&EEPROM簡介——瑞薩RA系列FSP庫開發實戰指南(66)

