一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32CubeMx之硬件IIC驅(qū)動(dòng)EEPROM詳解

嵌入式技術(shù) ? 來(lái)源:嵌入式技術(shù) ? 作者:嵌入式技術(shù) ? 2022-05-30 09:15 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1. I2C簡(jiǎn)介

I2C( Inter-Integrated Circuit)總線是由 PHILIPS 公司開(kāi)發(fā)的兩線式串行總線,用于連接微控制器及其外圍設(shè)備。是微電子通信控制領(lǐng)域廣泛采用的一種總線標(biāo)準(zhǔn)。具有接口線少,控制方式簡(jiǎn)單,器件封裝形式小,通信速率較高等優(yōu)點(diǎn)。
I2C特性:
(1)只要求兩條總線線路一條串行數(shù)據(jù)線SDA,一條串行時(shí)鐘線SCL;
(2)每個(gè)連接到總線的器件都可以通過(guò)唯一的地址和一直存在的簡(jiǎn)單的主機(jī)/從機(jī)關(guān)系軟件設(shè)定地址,主機(jī)可以作為主機(jī)發(fā)送器或主機(jī)接收器;
(3)它是一個(gè)真正的多主機(jī)總線,如果兩個(gè)或更多主機(jī)同時(shí)初始化數(shù)據(jù)傳輸可以通過(guò)沖突檢測(cè)和仲裁防止數(shù)據(jù)被破壞;
(4)串行的 8 位雙向數(shù)據(jù)傳輸位速率在標(biāo)準(zhǔn)模式下可達(dá)100kbit/s,快速模式下可達(dá)400kbit/s,高速模式下可達(dá) 3.4Mbit/s;
(5)片上的濾波器可以濾去總線數(shù)據(jù)線上的毛刺波保證數(shù)據(jù)完整;
(6)連接到相同總線的IC數(shù)量只受到總線的最大電容400pF;
IIC是屬串行通訊總線,同步傳輸、半雙工。

2. I2C總線協(xié)議

IIC協(xié)議格式:起始信號(hào)、停止信號(hào)、應(yīng)答信號(hào)、非應(yīng)答信號(hào)、發(fā)送數(shù)據(jù)、接收數(shù)據(jù)。
??空閑狀態(tài):SCL和SDA均保持高電平;

2.1 起始信號(hào)

時(shí)鐘為高電平時(shí),數(shù)據(jù)由高電平變?yōu)榈碗娖健?/p> 在這里插入圖片描述

SDA_OUT=1;
SCL=1;
delay_us(2);
SDA_OUT=0;
//方便下一次數(shù)據(jù)收發(fā)
delay_us(2);
SCL=0;

2.2 停止信號(hào)

??時(shí)鐘線為高電平時(shí),數(shù)據(jù)線由低變高。

SDA_OUT=0;
SCL=0;
Delay_us(2);
SCL=1;
Delay_us(2);
SDA_OUT=1;

數(shù)據(jù)傳輸時(shí)序:

在這里插入圖片描述

2.3 獲取應(yīng)答

??時(shí)鐘線為高時(shí)讀取數(shù)據(jù)。應(yīng)答信號(hào)本身就是一位數(shù)據(jù)。

u8 i=0;
SCL=0;//告訴從機(jī),主機(jī)需要讀取數(shù)據(jù)
Delay_us(2);
SCL=1;//開(kāi)始讀取數(shù)據(jù)
while(SDA_IN)
{
  i++;
  Delay_us(1);
  if(i>=20)return 1;//非應(yīng)答
}
Delay_us(2);
SCL=0;//方便下一次數(shù)據(jù)收發(fā)
return 0;//獲取應(yīng)答信號(hào)

2.4 發(fā)送應(yīng)答(非應(yīng)答)信號(hào)

時(shí)鐘線為低電平時(shí)發(fā)送數(shù)據(jù)。應(yīng)答信號(hào)本身就是一位數(shù)據(jù)。

SCL=0;
SDA_OUT=ack&0x01;//ack為應(yīng)答參數(shù),0為應(yīng)答,1為非應(yīng)答
Delay_us(2);
SCL=1;//數(shù)據(jù)發(fā)送完成
//方便下一次數(shù)據(jù)收發(fā)
Delay_us(2);
SCL=0;

2.5 發(fā)送一個(gè)字節(jié)數(shù)據(jù)

for(i=0;i<8;i++)
{
  SCL=0;
  if(data&0x80)SDA_OUT=1;
  else SDA_OUT=0;
  Delay_us(2);
SCL=1;//數(shù)據(jù)發(fā)送完成
data<<=1;
Delay_us(2);
}
SCL=0;//方便下一次數(shù)據(jù)收發(fā)

2.6 接收一個(gè)字節(jié)數(shù)據(jù)

u8 data=0; 
for(i=0;i<8;i++)
{
SCL=0;//告訴從機(jī),主機(jī)需要讀取數(shù)據(jù)
Delay_us(2);
SCL=1;//主機(jī)開(kāi)始讀取數(shù)據(jù)
data<<=1;
if(SDA_IN)data|=0x01;
Delay_us(2);
}
SCL=0;//方便下一次數(shù)據(jù)收發(fā)
return data;

3. AT24CXX介紹

?CAT24WC01/02/04/08/16是一個(gè)1K/2K/4K/8K/16K位串行CMOS E2PROM。內(nèi)部含有12/256/512/1024/2048個(gè)8位字節(jié),CATALYST公司的先進(jìn)CMOS技術(shù)實(shí)質(zhì)上減少了器件的功耗,CAT24WC01有一個(gè)8字節(jié)頁(yè)寫(xiě)緩沖器,CAT24WC02/04/08/16有一個(gè)16字節(jié)頁(yè)寫(xiě)緩沖器,該器件通過(guò)I2C總線接口進(jìn)行操作有一個(gè)專(zhuān)門(mén)的寫(xiě)保護(hù)功能。
特性
(1)與400KHz I2C總線兼容
(2)1.8到6.0伏工作電壓范圍
(3)低功耗CMOS 技術(shù)
(4)寫(xiě)保護(hù)功能當(dāng)WP為高電平時(shí)進(jìn)入寫(xiě)保護(hù)狀態(tài)
(5)頁(yè)寫(xiě)緩沖器
(6)自定時(shí)擦寫(xiě)周期
(7)1,000,000編程/擦除周期
(8)可保存數(shù)據(jù)100年
(9)8 腳 DIP SOIC或TSSOP封裝
(10)溫度范圍:商業(yè)級(jí)工業(yè)級(jí)和汽車(chē)級(jí)

3.1 引腳說(shuō)明

在這里插入圖片描述pYYBAGKTeGaAScIzAADa8D09r5s327.png

3.2 總線時(shí)序

??時(shí)鐘上升沿讀取數(shù)據(jù),下降發(fā)送數(shù)據(jù)。

pYYBAGKTeIWAafM2AAFhAB41sU4106.png

3.3 從器件地址

pYYBAGKTeLSAL4BDAAEWla1OldI133.png

3.4 寫(xiě)操作時(shí)序
字節(jié)寫(xiě)
在字節(jié)寫(xiě)模式下,主器件發(fā)送起始命令和從器件地址信息(R/W位置零)給從器件在從器件產(chǎn)生應(yīng)答信號(hào)后,主器件發(fā)送 CAT24WC01/02/04/08/16的字節(jié)地址,主器件在收到從器件的另一個(gè)應(yīng)答信號(hào)后,再發(fā)送數(shù)據(jù)到被尋址的存儲(chǔ)單元。AT24WC01/02/04/08/16再次應(yīng)答,并在主器件產(chǎn)生停止信號(hào)后開(kāi)始內(nèi)部數(shù)據(jù)的擦寫(xiě),在內(nèi)部擦寫(xiě)過(guò)程中,CAT24WC01/02/04/08/16不再應(yīng)答主器件的任何請(qǐng)求。

pYYBAGKTeN2AQgIZAACNdPj7xvs655.png

頁(yè)寫(xiě)
用頁(yè)寫(xiě), CAT24WC01可一次寫(xiě)入8個(gè)字節(jié)數(shù)據(jù),CAT24WC02/04/08/16可以一次寫(xiě)入16個(gè)字節(jié)的數(shù)據(jù)。頁(yè)寫(xiě)操作的啟動(dòng)和字節(jié)寫(xiě)一樣不同在于傳送了一字節(jié)數(shù)據(jù)后并不產(chǎn)生停止信號(hào)。主器件被允許發(fā)送P(AT24WC01 P=7;AT24WC02/04/08/16 P=15)個(gè)額外的字節(jié),每發(fā)送一個(gè)字節(jié)數(shù)據(jù)后,CAT24WC01/02/04/08/16產(chǎn)生一個(gè)應(yīng)答位并將字節(jié)地址低位加1,高位保持不變。
如果在發(fā)送停止信號(hào)之前,主器件發(fā)送超過(guò)P+1個(gè)字節(jié),地址計(jì)數(shù)器將自動(dòng)翻轉(zhuǎn),先前寫(xiě)入的數(shù)據(jù)被覆蓋。
接收到P+1字節(jié)數(shù)據(jù)和主器件發(fā)送的停止信號(hào)后,CAT24CXXX啟動(dòng)內(nèi)部寫(xiě)周期將數(shù)據(jù)寫(xiě)到數(shù)據(jù)區(qū)。所有接收的數(shù)據(jù)在一個(gè)寫(xiě)周期內(nèi)寫(xiě)入CAT24WC01/02/04/08/16。

poYBAGKTey2AS5SnAABz_94v1Qk055.png#pic_center

3.5 讀操作時(shí)序

選擇性讀
選擇性讀操作允許主器件對(duì)寄存器的任意字節(jié)進(jìn)行讀操作,主器件首先通過(guò)發(fā)送起始信號(hào)、從器件地址和它想讀取的字節(jié)數(shù)據(jù)的地址執(zhí)行一個(gè)偽寫(xiě)操作。在 CAT24WC01/02/04/08/16 應(yīng)答之后,主器件重新發(fā)送起始信號(hào)和從器件地址,此時(shí)R/W 位置1,CAT24WC01/02/04/08/16響應(yīng)并發(fā)送應(yīng)答信號(hào),然后輸出所要求的一個(gè) 8位字節(jié)數(shù)據(jù),主器件不發(fā)送應(yīng)答信號(hào)但產(chǎn)生一個(gè)停止信號(hào)。

poYBAGKTeTuAG1gkAADGs24yzr8660.png

連續(xù)讀
連續(xù)讀操作可通過(guò)立即讀或選擇性讀操作啟動(dòng)。在CAT24WC01/02/04/08/16發(fā)送完一個(gè)8位字節(jié)數(shù)據(jù)后,主器件產(chǎn)生一個(gè)應(yīng)答信號(hào)來(lái)響應(yīng),告知CAT24WC01/02/04/08/16 主器件要求更多的數(shù)據(jù),對(duì)應(yīng)每個(gè)主機(jī)產(chǎn)生的應(yīng)答信號(hào)CAT24WC01/02/04/08/16將發(fā)送一個(gè)8位數(shù)據(jù)字節(jié)。當(dāng)主器件不發(fā)送應(yīng)答信號(hào)而發(fā)送停止位時(shí)結(jié)束此操作。
從CAT24WC01/02/04/08/16 輸出的數(shù)據(jù)按順序由N到N+1輸出。讀操作時(shí)地址計(jì)數(shù)器CAT24WC01/02/04/08/16整個(gè)地址內(nèi)增加,這樣整個(gè)寄存器區(qū)域在可在一個(gè)讀操作內(nèi)全部讀出。當(dāng)讀取的字節(jié)超過(guò) E(對(duì)于 24WC01,E=127;對(duì)24WC02,E=255;對(duì)24WC04,E=511;對(duì)24WC08,E=1023;對(duì)24WC16 E=2047)計(jì)數(shù)器將翻轉(zhuǎn)到零并繼續(xù)輸出數(shù)據(jù)字節(jié)。

pYYBAGKTeZGAQE8gAAC9mWie3rw101.png

4. EEPROM硬件接口

??在本示例中采用的EEPROM芯片為AT24C08型號(hào),該封裝類(lèi)型和24C02完全兼容;
??AT24C08容量為8Kbit,即1KB,1024字節(jié);24C02量為2kbit,為256字節(jié)。

poYBAGKTedGARlT4AAC09RyDXRs917.png

引腳 GPIO
IIC_SCL 時(shí)鐘線PB6
IIC_SDA 雙向數(shù)據(jù)線PB7

5.軟件設(shè)置

poYBAGKTejiAXOxwAAOJ_72z6OU272.png

6.代碼生成

6.1 IIC硬件配置

poYBAGKTelWAaTLuAAKPX8_2IDY028.png

6.2 IIC硬件產(chǎn)生起始信號(hào)、停止信號(hào)

//產(chǎn)生起始信號(hào)
void IIC_Start(void)
{
   hi2c1.Instance->CR1|=1<<8;
   while(!(hi2c1.Instance->SR1&1<<0)){}//等待起始信號(hào)發(fā)送成功
   hi2c1.Instance->CR1&=~(1<<8);
}
//停止信號(hào)
void IIC_Stop(void)
{
	hi2c1.Instance->CR1|=1<<9;
}

6.3 IIC硬件數(shù)據(jù)收發(fā)

//發(fā)送數(shù)據(jù)
void IIC_WriteData(uint8_t data)
{
   hi2c1.Instance->DR=data;
   while(!(hi2c1.Instance->SR1&1<<7)){}//等待數(shù)據(jù)發(fā)送完成
   
}
/*發(fā)送地址*/
void IIC_WriteAddr(uint8_t adrr)
{
	uint8_t stat;
	hi2c1.Instance->DR=adrr;
	while(!(hi2c1.Instance->SR1&1<<1)){}//等待數(shù)據(jù)發(fā)送完成
	stat=hi2c1.Instance->SR2;//對(duì)SR2讀取清除標(biāo)志位
}
uint8_t IIC_readData(void)
{
	uint8_t data;
	hi2c1.Instance->CR1|=1<<10;//產(chǎn)生應(yīng)答
	while(!(hi2c1.Instance->SR1&1<<6)){}//等待數(shù)據(jù)到來(lái)
	data=hi2c1.Instance->DR;
	hi2c1.Instance->CR1&=~(1<<10);//取消應(yīng)答發(fā)送
	return data;
}

6.4 AT24C08讀寫(xiě)字節(jié)

#define AT24C08_ADDR_W 0xA0  //器件地址+寫(xiě)使能位
#define AT24C08_ADDR_R 0xA1  //器件地址+讀使能位
/*寫(xiě)一個(gè)字節(jié)函數(shù)*/
void AT24C08_WriteOneByte(uint8_t addr,uint8_t data)
{
	IIC_Start();//發(fā)送起始信號(hào)
	IIC_WriteAddr(AT24C08_ADDR_W);//發(fā)送地址
	IIC_WriteData(addr);//發(fā)送寫(xiě)入數(shù)據(jù)地址
	IIC_WriteData(data);//寫(xiě)入數(shù)據(jù)
	IIC_Stop();//停止信號(hào)
	HAL_Delay(10);//寫(xiě)周期時(shí)間
}
/*讀一個(gè)字節(jié)函數(shù)*/
uint8_t AT24C08_ReadOneByte(uint8_t addr)
{
	uint8_t data;  
	IIC_Start();//發(fā)送起始信號(hào)
	IIC_WriteAddr(AT24C08_ADDR_W);//器件地址+寫(xiě)使能
	IIC_WriteData(addr);//發(fā)送寫(xiě)入數(shù)據(jù)地址
	IIC_Start();//發(fā)送起始信號(hào)
	IIC_WriteAddr(AT24C08_ADDR_R);//器件地址+讀使能
	data=IIC_readData();//讀取一個(gè)字節(jié)數(shù)據(jù)
	IIC_Stop();//停止信號(hào)
	return data;
}

6.5 主函數(shù)

//發(fā)送數(shù)據(jù)
void IIC_WriteData(uint8_t data)
{
   hi2c1.Instance->DR=data;
   while(!(hi2c1.Instance->SR1&1<<7)){}//等待數(shù)據(jù)發(fā)送完成
   
}
/*發(fā)送地址*/
void IIC_WriteAddr(uint8_t adrr)
{
	uint8_t stat;
	hi2c1.Instance->DR=adrr;
	while(!(hi2c1.Instance->SR1&1<<1)){}//等待數(shù)據(jù)發(fā)送完成
	stat=hi2c1.Instance->SR2;//對(duì)SR2讀取清除標(biāo)志位
}
uint8_t IIC_readData(void)
{
	uint8_t data;
	hi2c1.Instance->CR1|=1<<10;//產(chǎn)生應(yīng)答
	while(!(hi2c1.Instance->SR1&1<<6)){}//等待數(shù)據(jù)到來(lái)
	data=hi2c1.Instance->DR;
	hi2c1.Instance->CR1&=~(1<<10);//取消應(yīng)答發(fā)送
	return data;
}

注意:STM32F10x硬件IIC和FSMC不能同時(shí)使用;
??在STM32勘誤手冊(cè)中有說(shuō)明:

在這里插入圖片描述

6.6 示例效果

poYBAGKTeuaAHWM5AAEf4ga-p0Q933.png

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 驅(qū)動(dòng)
    +關(guān)注

    關(guān)注

    12

    文章

    1912

    瀏覽量

    86757
  • STM32
    +關(guān)注

    關(guān)注

    2291

    文章

    11026

    瀏覽量

    363775
  • IIC
    IIC
    +關(guān)注

    關(guān)注

    11

    文章

    306

    瀏覽量

    39383
  • EEPORM
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    2118
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    STM32CubeMX如何配置

    小伙伴對(duì)于電機(jī)驅(qū)動(dòng)和編碼器不懂的話(huà)請(qǐng)看:電機(jī)驅(qū)動(dòng)講解:【平衡小車(chē)制作】(二)電機(jī)驅(qū)動(dòng)(超詳解)編碼器講解:【平衡小車(chē)制作】(三)編碼器講解(超詳解
    發(fā)表于 07-23 09:37

    STM32CubeMX該如何配置

    電機(jī)轉(zhuǎn)速與編碼器讀?。ǔ?b class='flag-5'>詳解) 對(duì)于STM32CubeMX的配置基本類(lèi)似。??話(huà)不多說(shuō),開(kāi)始今天的學(xué)習(xí)吧!
    發(fā)表于 08-11 06:46

    stm32cubemx教程

    stm32cubemx教程,需要學(xué)習(xí)的看看,免積分
    發(fā)表于 11-02 10:16 ?0次下載

    STM32CubeMx使用詳解

    個(gè)人原創(chuàng),圖文并茂,詳細(xì)介紹了STM32CubeMx的軟件界面,配置過(guò)程,以及對(duì)生成的Keil工程的詳細(xì)分析。
    發(fā)表于 12-15 22:42 ?19次下載

    STM32CubeMx使用詳解所用工程

    STM32CubeMx使用詳解所用工程
    發(fā)表于 10-30 15:44 ?25次下載

    STM32CubeMX新建工程的過(guò)程及方法解析

    關(guān)于STM32CubeMX新建工程的過(guò)程。最終通過(guò)STM32CubeMX工具配置完成一個(gè)驅(qū)動(dòng)IO(點(diǎn)亮LED)的軟件工程,也就是通過(guò)STM32CubeMX配置完成之后,打開(kāi)工程直接下載
    發(fā)表于 11-27 16:43 ?7340次閱讀

    關(guān)于STM32CubeMX重大升級(jí)

    STM32CubeMX重大升級(jí)
    的頭像 發(fā)表于 03-04 14:05 ?4116次閱讀

    淺談stm32cubemx安裝教程

    STM32CubeMX介紹、下載與安裝
    的頭像 發(fā)表于 03-25 10:57 ?2w次閱讀
    淺談<b class='flag-5'>stm32cubemx</b>安裝教程

    STM32CubeMX第三篇串口實(shí)驗(yàn)

    STM32CubeMX第三篇串口實(shí)驗(yàn)
    發(fā)表于 12-05 11:21 ?6次下載
    <b class='flag-5'>STM32CubeMX</b>第三篇<b class='flag-5'>之</b>串口實(shí)驗(yàn)

    STM32CubeMx學(xué)習(xí)——?jiǎng)?chuàng)建LED燈工程(基于STM32L071KBU)

    STM32CubeMx學(xué)習(xí)——?jiǎng)?chuàng)建LED燈工程(基于STM32L071KBU)本文介紹利用STM32CubeMx來(lái)創(chuàng)建工程代碼,并且將代碼下載到開(kāi)發(fā)板加以驗(yàn)證。本次實(shí)驗(yàn)芯片為
    發(fā)表于 12-06 20:06 ?17次下載
    <b class='flag-5'>STM32CubeMx</b>學(xué)習(xí)<b class='flag-5'>之</b>——?jiǎng)?chuàng)建LED燈工程(基于<b class='flag-5'>STM32</b>L071KBU)

    STM32CubeMX安裝與使用——實(shí)現(xiàn)流水燈

    STM32CubeMX安裝與使用——實(shí)現(xiàn)流水燈
    發(fā)表于 12-07 10:06 ?26次下載
    <b class='flag-5'>STM32CubeMX</b>安裝與使用——實(shí)現(xiàn)流水燈

    STM32CubeMX——搭建環(huán)境、編譯燒寫(xiě)

    STM32CubeMX生成工程文件(一)選擇MCU和封裝(二)配置時(shí)鐘(三)配置調(diào)試模式(四)配置GPIO(五)代碼生成三、填寫(xiě)main函數(shù)四、編譯與仿真運(yùn)行五、燒寫(xiě)與硬件實(shí)現(xiàn)六、總結(jié)七、參考文章一、STM32CubeMX的環(huán)境
    發(fā)表于 12-07 10:21 ?22次下載
    <b class='flag-5'>STM32CubeMX</b>——搭建環(huán)境、編譯燒寫(xiě)

    STM32學(xué)習(xí)STM32cubeMX軟件安裝與使用(附STM32cubeMX5.2.1下載地址)

    STM32學(xué)習(xí)STM32cubeMX軟件安裝與使用(附STM32cubeMX5.2.1下載地址)
    發(fā)表于 12-07 11:51 ?28次下載
    <b class='flag-5'>STM32</b>學(xué)習(xí)<b class='flag-5'>之</b><b class='flag-5'>STM32cubeMX</b>軟件安裝與使用(附<b class='flag-5'>STM32cubeMX</b>5.2.1下載地址)

    STM32CubeMX 窗口及工具介紹

    STM32CubeMX 系列教程之 STM32CubeMX 窗口及 STM32PackCreator 工具介紹,內(nèi)附詳細(xì)圖文介紹。
    發(fā)表于 12-14 18:51 ?27次下載
    <b class='flag-5'>STM32CubeMX</b> 窗口及工具介紹

    STM8CubeMXSTM32CubeMX功能一樣嗎?

    STM8CubeMXSTM32CubeMX功能一樣嗎?
    的頭像 發(fā)表于 10-31 16:59 ?2178次閱讀
    STM8<b class='flag-5'>CubeMX</b>和<b class='flag-5'>STM32CubeMX</b>功能一樣嗎?