嵌入式培訓(xùn)—12.23

① I2C(內(nèi)部集成總線)

????????(1)SDK時(shí)鐘線;

????????(2)SDA數(shù)據(jù)線;

(節(jié)省硬件資源)

② 傳輸協(xié)議(信號獨(dú)立于數(shù)據(jù)):

????????(1)起始信號:SCL高電平時(shí),SDA為下降沿時(shí);

????????(2)結(jié)束信號:SCL高電平時(shí),SDA為上升沿時(shí);

????????(3)校驗(yàn):握手(接收方應(yīng)答):

????????????????< 1 > ACK:應(yīng)答,數(shù)據(jù)線低電平;

????????????????< 2 > NACK:非應(yīng)答,數(shù)據(jù)線高電平;

????????(1)時(shí)序:


????????????????< 1 > SCL:第1—7 bit 從設(shè)備地址 + 第8 bit 傳輸方向(0—主向從發(fā),1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?????????—從向主發(fā))+ 第9 bit 校驗(yàn)位(應(yīng)答);

----------------------------------------------------------------------------------------------

? ? ? ? ? ? ? ? ? ? ? ? ? SDA:8 bit 有效數(shù)據(jù) + 1 bit 校驗(yàn)位(應(yīng)答);

????????????????< 2 >在時(shí)鐘線的低電平進(jìn)行數(shù)據(jù)線的電平變換;

????????????????< 3 >在時(shí)鐘線的高電平進(jìn)行鎖存;

????????????????< 4 >數(shù)據(jù)格式高位在前(MSB);

③ 地址

????????(1)設(shè)備號(設(shè)備地址):

????????E2PROM:

????????????????< 1 > ROM只讀存儲器;

????????????????????????A . PROM ? (可編程存儲器);

????????????????????????B . EPROM (可擦寫編程存儲器);

????????????????????????C . E2PROM (電信號可擦寫編程存儲器),存儲量小,造價(jià)高;


????????????????????????Flash:

????????????????????????????????a . NorFlash ;

????????????????????????????????b . NandFlash ;


????????????????< 2 > RAM隨機(jī)存儲器;

????????????????????????A . SRAM (靜態(tài)存儲器),造價(jià)高;

????????????????????????B . DRAM (動(dòng)態(tài)存儲器),需要定時(shí)刷新(電容充電);

????????????????????????C . SDRAM ;

????????????????????????D . DDR ;

????????(2)設(shè)備內(nèi)地址;

④ 端序

????????(1)大端序:高位在低地址;

????????(2)小端序:高位在高地址;

⑤E2PROM

????????(1)寫:起始 + 設(shè)備號 + 傳輸方向(0) + 應(yīng)答 + 從設(shè)備內(nèi)地址 + 應(yīng)答 + 多個(gè)數(shù) ????????????????????????據(jù)(從設(shè)備應(yīng)答)+結(jié)束信號;

????????????????按字節(jié)寫:每寫一個(gè)地址,帶一個(gè)地址;

????????????????按頁寫:大小1—16字節(jié),跨頁重發(fā)地址;

? ? ? ?(2)讀:起始 + 設(shè)備號 + 傳輸方向(0) + 應(yīng)答 + 從設(shè)備內(nèi)地址 + 應(yīng)答 + 起始位 ????????????????????????+設(shè)備號 + 傳輸方向(1) + 應(yīng)答 + ?多個(gè)數(shù)據(jù)(主設(shè)備應(yīng)答)+ ????????????????????????主設(shè)備非應(yīng)答 + 結(jié)束;

⑥ 使用I2C實(shí)現(xiàn)串口通信

? ? ? ? 代碼:

#include "mapp.h"

#define E2PROM_ID? ? ? ? 0xA0

#define E2PROM_Timeout? 0xFFFF

int? Layer = 0;

uint8_t Layer_Buf[4][100]={"Hello,world !\r\n", "Hello,Sean !\r\n", "Hello,Tom !\r\n", "Hello,Billy !\r\n"};

/********************

HAL?aoˉêy

*****************/

void e2prom_read(uint8_t madd,uint8_t *buf,uint32_t size)

{

HAL_I2C_Mem_Read(& hi2c1, E2PROM_ID,madd, 1,buf, size, E2PROM_Timeout);

HAL_Delay(2);

}

void e2prom_write(uint8_t madd,uint8_t *buf,uint32_t size)

{

uint32_t i;

for(i=0;i<size;i++)

{

//μ¥×??úD′

HAL_I2C_Mem_Write(&hi2c1, E2PROM_ID, madd, 1, &buf[i], 1, E2PROM_Timeout);

madd++;

HAL_Delay(2);

}

}

void I2C_Tel()

{

uint8_t buf[100];

if(Layer == 0)

{

e2prom_write(0,Layer_Buf[0],15);

memset(buf,0,100);

e2prom_read(0,buf,15);

printf("%s",buf);

}

if(Layer == 1)

{

e2prom_write(64,Layer_Buf[1],14);

memset(buf,0,20);

e2prom_read(64,buf,14);

printf("%s",buf);

}

if(Layer == 2)

{

e2prom_write(128,Layer_Buf[2],13);

memset(buf,0,20);

e2prom_read(128,buf,13);

printf("%s",buf);

}

if(Layer == 3)

{

e2prom_write(192,Layer_Buf[3],15);

memset(buf,0,20);

e2prom_read(192,buf,15);

printf("%s",buf);

}

}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{

if(GPIO_Pin == GPIO_PIN_0)

{

Layer ++;

if(Layer > 3)

Layer = 0;

I2C_Tel();

}

if(GPIO_Pin == GPIO_PIN_13)

{

Layer --;

if(Layer < 0)

Layer = 3;

I2C_Tel();

}

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容