生活随笔
收集整理的這篇文章主要介紹了
《STM32从零开始学习历程》——I2C向EEPROM写入一字节数据(I2C硬件)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
《STM32從零開始學(xué)習(xí)歷程》@EnzoReventon
I2C向EEPROM寫入一字節(jié)數(shù)據(jù)(I2C硬件)
相關(guān)鏈接:
I2C物理層介紹
I2C協(xié)議層介紹
I2C固件庫介紹
STM32的I2C特性及架構(gòu)介紹
STM32的EEPROM簡介
參考資料:
[野火EmbedFire]《STM32庫開發(fā)實(shí)戰(zhàn)指南——基于野火霸天虎開發(fā)板》
[正點(diǎn)原子]STM32F4開發(fā)指南-庫函數(shù)版本_V1.2
[ST]《STM32F4xx中文參考手冊》
[ATMEL]《AT24C02說明書》
開發(fā)板硬件原理圖;EEPROM原理圖。
1 實(shí)現(xiàn)功能
本實(shí)驗(yàn)所要完成的任務(wù)是通過I2C向EEPROM中發(fā)送一個(gè)字節(jié)的數(shù)據(jù)。
并且能夠通過串口調(diào)試助手查看到發(fā)送狀態(tài)與現(xiàn)實(shí)錯(cuò)誤代碼。
2 硬件設(shè)計(jì)
本實(shí)驗(yàn)采用的開發(fā)板為“正點(diǎn)原子”探索者F4開發(fā)板,核心芯片為F407ZGT6。
使用到的外設(shè)及硬件為:USART1,I2C1,EEPROM。
USART1:PA9(T)—》RXE;PA10(R) —》TXE,將引腳使用跳線帽相連接即可。
3 軟件設(shè)計(jì)流程
GPIO功能復(fù)用初始化GPIOI2C初始化I2C使能定義寫入數(shù)據(jù)函數(shù)根據(jù)EEPROM寫數(shù)據(jù)流程調(diào)用函數(shù)。
EEPROM寫數(shù)據(jù)流程請參考:《STM32從零開始學(xué)習(xí)歷程》——STM32的EEPROM簡介。此處不做過多的詳解。編寫主函數(shù),并發(fā)送數(shù)據(jù)。優(yōu)化代碼(超時(shí),故障代碼)
4 代碼分析
I2C初始化函數(shù)
void IIC_Init(void)
{ GPIO_InitTypeDef GPIO_InitStructure
; I2C_InitTypeDef I2C_InitStructure
; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB
, ENABLE
); RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1
, ENABLE
); GPIO_PinAFConfig(GPIOB
,GPIO_PinSource8
,GPIO_AF_I2C1
); GPIO_PinAFConfig(GPIOB
,GPIO_PinSource9
,GPIO_AF_I2C1
); GPIO_InitStructure
.GPIO_Pin
= GPIO_Pin_8
;GPIO_InitStructure
.GPIO_Mode
= GPIO_Mode_AF
; GPIO_InitStructure
.GPIO_OType
= GPIO_OType_OD
; GPIO_InitStructure
.GPIO_Speed
= GPIO_Speed_100MHz
; GPIO_InitStructure
.GPIO_PuPd
= GPIO_PuPd_UP
; GPIO_Init(GPIOB
, &GPIO_InitStructure
); GPIO_InitStructure
.GPIO_Pin
= GPIO_Pin_9
;GPIO_InitStructure
.GPIO_Mode
= GPIO_Mode_AF
; GPIO_InitStructure
.GPIO_OType
= GPIO_OType_OD
; GPIO_InitStructure
.GPIO_Speed
= GPIO_Speed_100MHz
; GPIO_InitStructure
.GPIO_PuPd
= GPIO_PuPd_UP
; GPIO_Init(GPIOB
, &GPIO_InitStructure
); I2C_InitStructure
.I2C_Ack
= I2C_Ack_Enable
; I2C_InitStructure
.I2C_AcknowledgedAddress
= I2C_AcknowledgedAddress_7bit
; I2C_InitStructure
.I2C_ClockSpeed
= 400000; I2C_InitStructure
.I2C_DutyCycle
= I2C_DutyCycle_2
; I2C_InitStructure
.I2C_Mode
= I2C_Mode_I2C
; I2C_InitStructure
.I2C_OwnAddress1
= 0x78; I2C_Init(I2C1
,&I2C_InitStructure
); I2C_Cmd(I2C1
,ENABLE
); }
I2C寫入數(shù)據(jù)函數(shù)
#define TIME_OUT 0x000FFFFFuint32_t count_wait
= TIME_OUT
;
uint8_t
EEPROM_Byte_Write(uint8_t addr
, uint8_t date
)
{I2C_GenerateSTART(I2C1
,ENABLE
); count_wait
= TIME_OUT
;while(I2C_CheckEvent(I2C1
,I2C_EVENT_MASTER_MODE_SELECT
) != SUCCESS
){count_wait
--; if(count_wait
== 0) {return Error_Back(1);}}I2C_Send7bitAddress(I2C1
,0xa0,I2C_Direction_Transmitter
);count_wait
= TIME_OUT
;while(I2C_CheckEvent(I2C1
,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED
) != SUCCESS
){count_wait
--;if(count_wait
== 0){return Error_Back(2);}}I2C_SendData(I2C1
,addr
);count_wait
= TIME_OUT
;while(I2C_CheckEvent(I2C1
,I2C_EVENT_MASTER_BYTE_TRANSMITTED
) != SUCCESS
){count_wait
--;if(count_wait
== 0){return Error_Back(3);}}I2C_SendData(I2C1
,date
);count_wait
= TIME_OUT
; while(I2C_CheckEvent(I2C1
,I2C_EVENT_MASTER_BYTE_TRANSMITTED
) != SUCCESS
){count_wait
--;if(count_wait
== 0){return Error_Back(4);} }I2C_GenerateSTOP(I2C1
,ENABLE
);return 0;
}
主函數(shù)
int main(void)
{ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2
); delay_init(168); uart_init(115200); LED_Init(); LCD_Init(); KEY_Init(); IIC_Init(); EEPROM_Byte_Write(0x05, 0x22); printf("okok");
}
5 效果展示
程序正常時(shí):串口助手上顯示okok,表明數(shù)據(jù)已經(jīng)傳輸。
我們將等待EV6事件完成時(shí)將條件更改,模擬EV6卡死在循環(huán)中,下載程序,串口助手顯示錯(cuò)誤3,我們便可以在程序中很快定位到EV6,錯(cuò)誤3的地方進(jìn)行檢查。其余的以此類推。
6 小結(jié)
這個(gè)實(shí)驗(yàn)不難,主要是熟練以下寄存器的使用已經(jīng)一個(gè)設(shè)計(jì)的流程,其次,代碼功能的優(yōu)化也是非常重要的,在文中,錯(cuò)誤代碼的顯示以及程序超時(shí)這兩個(gè)功能(從野火那兒學(xué)習(xí)來的)都是屬于代碼優(yōu)化。所以我們要放寬視野,多學(xué)學(xué)人家良好的編程習(xí)慣。謝謝!請各位大佬不吝賜教!
總結(jié)
以上是生活随笔為你收集整理的《STM32从零开始学习历程》——I2C向EEPROM写入一字节数据(I2C硬件)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。