-*-記錄給自己備忘,供大家交流, -*-相關時序可以在 eeprom datasheet 上面可以看到,在此不做解釋 作者: 棒糖 Cavin 平臺:keil5 & STM32G031KE8T6 時間:20201101 1、硬體IIC不需要自己去生成開始位結束位,只需呼叫配置函式LL_I2C_HandleTransfer,通過設定引數來進行收發 2、注意引數設定,例如 LL_I2C_MODE_AUTOEND 和 LL_I2C_GENERATE_START_WRITE 是用于寫操作、LL_I2C_MODE_SOFTEND 和 LL_I2C_GENERATE_START_READ 是用于讀操作 要注意分別, 3、加入超時設定,如果記時到及時退出并清空相應標志位,我把它寫成一個函式,有不妥之處但無傷大雅, 4、一次STOP之后還是要等待5ms以上以便eeprom寫入資料,連續寫時由于只有一個stop位只會等待一次,但注意別超過頁位元組數, 以下是原始碼:
1 /************************************************************* 2 Function Name: E2PROM_Write_Byte 3 Function Description: 輪詢寫位元組,不超過一頁資料,作為頁寫入輔助 4 Inputs: TargetAddress(DeviceAddress設備地址+DataAddress位元組地址), 5 *pdata -資料指標, 6 txLen -資料長度, 7 timeout-超時時間 8 Outputs: 正常0/例外1 9 Notes: 10 *************************************************************/ 11 uint8_t EEPROM_Write_Byte(uint8_t DeviceAddress, uint8_t MemAddress, uint8_t *pData, uint8_t TxLen,uint16_t Timeout) 12 { 13 /* 等待I2C總線空閑,超時進行錯誤處理 */ 14 while(LL_I2C_IsActiveFlag_BUSY(I2C1) == SET){ 15 /* 確認是否使能 */ 16 if(!LL_I2C_IsEnabled(I2C1)) 17 { 18 LL_I2C_Enable(I2C1); 19 } 20 /* clear RXNE flag */ 21 if (LL_I2C_IsActiveFlag_RXNE(I2C1)) 22 { 23 LL_I2C_ReceiveData8(I2C1); /* 讀出來清除標志位 */ 24 } 25 26 /* End of Transfer */ 27 if(LL_I2C_IsActiveFlag_STOP(I2C1)) 28 { 29 LL_I2C_ClearFlag_STOP(I2C1); 30 } 31 32 /* Clear NACKF Flag */ 33 if(LL_I2C_IsActiveFlag_NACK(I2C1)) 34 { 35 LL_I2C_ClearFlag_NACK(I2C1); 36 } 37 38 if(LL_SYSTICK_IsActiveCounterFlag()) 39 { 40 if (Timeout-- == 0) 41 { 42 EEPROM_ClearCR(); 43 return 1; 44 } 45 } 46 } 47 /* 發送器件地址 */ 48 LL_I2C_HandleTransfer(I2C1, DeviceAddress, LL_I2C_ADDRSLAVE_7BIT, (TxLen+1), LL_I2C_MODE_AUTOEND, LL_I2C_GENERATE_START_WRITE); 49 /* 等待發送 */ 50 /* RESET: When next data is written in Transmit data register. 51 SET: When Transmit data register is empty. */ 52 while(!LL_I2C_IsActiveFlag_TXE(I2C1)){ 53 if (LL_SYSTICK_IsActiveCounterFlag()) 54 { 55 if (Timeout-- == 0) 56 { 57 LL_I2C_ClearFlag_TXE(I2C1); 58 EEPROM_ClearCR(); 59 return 1; 60 } 61 } 62 } 63 /* 發送暫存器地址 */ 64 LL_I2C_TransmitData8(I2C1, MemAddress); 65 66 /* 發送資料 */ 67 while(TxLen>0){ 68 69 if(LL_I2C_IsActiveFlag_TXE(I2C1)){ 70 LL_I2C_TransmitData8(I2C1, *pData); 71 pData++; 72 TxLen--; 73 if (LL_SYSTICK_IsActiveCounterFlag()) 74 { 75 if (Timeout-- == 0) 76 { 77 LL_I2C_ClearFlag_TXE(I2C1); 78 EEPROM_ClearCR(); 79 return 1; 80 } 81 } 82 } 83 } 84 85 /* 等待停止位 */ 86 while(LL_I2C_IsActiveFlag_STOP(I2C1) ==RESET) 87 { 88 if (LL_SYSTICK_IsActiveCounterFlag()) 89 { 90 if (Timeout-- == 0) 91 { 92 EEPROM_ClearCR(); 93 return 1; 94 } 95 } 96 } 97 /* CLEAR FLAG */ 98 EEPROM_ClearCR(); 99 return 0; 100 }
/************************************************************* Function Name: EEPROM_Error_Callback Function Description: 錯誤處理,清除暫存器和標志位 Inputs: Outputs: Notes: *************************************************************/ void EEPROM_ClearCR(void){ /* Clear NACKF Flag */ LL_I2C_ClearFlag_NACK(I2C1); /* Clear STOP Flag */ LL_I2C_ClearFlag_STOP(I2C1); /* Clear Configuration Register 2, */ I2C1->CR2 &= (uint32_t)~((uint32_t)(I2C_CR2_SADD | I2C_CR2_HEAD10R | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_RD_WRN)); }
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/204714.html
標籤:其他
上一篇:k8s1.18三節點安裝
