国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【STM32L496】使用HAL庫(kù)實(shí)現(xiàn)I2C寫入/讀取數(shù)據(jù)(M24C32)

這篇具有很好參考價(jià)值的文章主要介紹了【STM32L496】使用HAL庫(kù)實(shí)現(xiàn)I2C寫入/讀取數(shù)據(jù)(M24C32)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

I2C原理與配置

IIC原理超詳細(xì)講解—值得一看
【嵌入式硬件芯片開(kāi)發(fā)筆記】EEPROM芯片M24C32配置流程
STM32硬件I2C與軟件模擬I2C超詳解

M24C32芯片了解

實(shí)現(xiàn)通信功能的芯片為M24C32,對(duì)此,芯片手冊(cè)上第一頁(yè)就有對(duì)其概括描述。

Automotive 32-Kbit serial I2C bus EEPROM with 1 MHz clock

啟動(dòng)/停止條件:當(dāng)串行時(shí)鐘(SCL)位于高電平狀態(tài),串行數(shù)據(jù)(SDA)位于下降沿時(shí),M24C32開(kāi)始接收數(shù)據(jù);串行數(shù)據(jù)(SDA)位于上升沿時(shí),M24C32停止接收數(shù)據(jù)。
數(shù)據(jù)輸入:SCL上升沿時(shí)SDA進(jìn)行采樣。SDA必須在SCL的上升沿期間保持穩(wěn)定,且當(dāng)SCL被驅(qū)動(dòng)為低電平時(shí),SDA才改變電平狀態(tài)。
設(shè)備尋址:設(shè)備選擇代碼由一個(gè)4位設(shè)備類型標(biāo)識(shí)符和一個(gè)3位芯片使能地址(E2、E1、E0)組成,設(shè)備類型標(biāo)識(shí)符中,1010b為選擇存儲(chǔ)器(to select the memory),1011b為選擇標(biāo)識(shí)頁(yè)(to select the Identification page)。
在一條I2C總線上最多可連接8個(gè)存儲(chǔ)器設(shè)備。每個(gè)片上使能輸入(E2、E1、E0)上都有一個(gè)唯一的3位代碼;當(dāng)收到設(shè)備選擇代碼時(shí),只有當(dāng)芯片使能地址與E2、E1、E0輸入解碼值相同時(shí),存儲(chǔ)器設(shè)備才會(huì)響應(yīng)。
第八位是讀寫位,1=read,0=write.
i2c讀取24aa256數(shù)據(jù) csdn,stm32,單片機(jī),嵌入式硬件

讀操作

看到Current Address Read這行,它是一次讀當(dāng)前地址數(shù)據(jù)的過(guò)程。在開(kāi)始信號(hào)發(fā)出后,主設(shè)備會(huì)發(fā)出一個(gè)7位片選信號(hào),第八位是設(shè)備讀/寫模式,ACK是從設(shè)備應(yīng)答信號(hào),當(dāng)從設(shè)備發(fā)來(lái)一個(gè)應(yīng)答信號(hào)時(shí),主設(shè)備會(huì)發(fā)送數(shù)據(jù),數(shù)據(jù)傳輸完成后,從設(shè)備不需要發(fā)應(yīng)答信號(hào),最后是主設(shè)備發(fā)送停止位結(jié)束這一次的讀操作。Random Address Read是隨機(jī)地址讀操作,而后面的Sequential Current Read就是按順序讀了。Random Address ReadSequential Random Read模式下,需要設(shè)備發(fā)送地址才能讀,所以有兩次發(fā)送地址的序列。
i2c讀取24aa256數(shù)據(jù) csdn,stm32,單片機(jī),嵌入式硬件
讀指令后,若總線發(fā)送額外的時(shí)鐘脈沖并確認(rèn)每個(gè)傳輸?shù)臄?shù)據(jù)字節(jié),則設(shè)備可按順序輸出下一字節(jié)。若終止字節(jié)流,總線必須不確認(rèn)最后一個(gè)字節(jié),并且必須生成一個(gè)停止條件。
讀模式下確認(rèn):對(duì)于所有讀指令,設(shè)備在發(fā)送每個(gè)字節(jié)后,在第9位時(shí)間內(nèi)等待一個(gè)確認(rèn)標(biāo)識(shí)符,若總線主設(shè)備不發(fā)送確認(rèn)(主驅(qū)動(dòng)器SDA在第9位時(shí)間為高),則設(shè)備終止數(shù)據(jù)傳輸并進(jìn)入待機(jī)模式。

寫操作

看到Byte Wirte這行,它是一次寫操作過(guò)程。在開(kāi)始信號(hào)發(fā)出后,主設(shè)備會(huì)發(fā)出一個(gè)7位片選信號(hào),第八位是設(shè)備讀/寫模式,ACK是從設(shè)備應(yīng)答信號(hào),當(dāng)從設(shè)備發(fā)來(lái)一個(gè)應(yīng)答信號(hào)時(shí),主設(shè)備會(huì)給從設(shè)備發(fā)送一個(gè)字節(jié)地址,如果從設(shè)備發(fā)來(lái)應(yīng)答信號(hào),主設(shè)備此時(shí)會(huì)再發(fā)一次字節(jié)地址,當(dāng)從設(shè)備應(yīng)答后,主設(shè)備才會(huì)發(fā)送數(shù)據(jù),數(shù)據(jù)傳輸完成后,從設(shè)備發(fā)來(lái)應(yīng)答信號(hào),最后是主設(shè)備發(fā)送停止位結(jié)束這一次的寫操作。Page Write是連續(xù)寫操作,前面的發(fā)片選和地址和Byte Write一樣,不一樣的是主設(shè)備會(huì)一直發(fā)數(shù)據(jù)。
i2c讀取24aa256數(shù)據(jù) csdn,stm32,單片機(jī),嵌入式硬件

HAL庫(kù)配置及初始化

根據(jù)原理圖和芯片手冊(cè)配置相關(guān)參數(shù)
i2c讀取24aa256數(shù)據(jù) csdn,stm32,單片機(jī),嵌入式硬件

i2c讀取24aa256數(shù)據(jù) csdn,stm32,單片機(jī),嵌入式硬件i2c讀取24aa256數(shù)據(jù) csdn,stm32,單片機(jī),嵌入式硬件
配置完成后,會(huì)生成一個(gè)i2c的句柄,當(dāng)我們需要對(duì)i2c進(jìn)行讀寫等操作時(shí),對(duì)hi2c取地址,它就會(huì)調(diào)用HAL庫(kù)中的寄存器回調(diào),然后實(shí)現(xiàn)i2c規(guī)范中的功能(比如說(shuō)init、status、mode、errcode這種)。

I2C_HandleTypeDef hi2c1;

部分代碼

一開(kāi)始列出的大概框架如下。

int i2c_write(const unsigned char *pwbuf, const unsigned short wbuflen);

int i2c_read(unsigned char *prBuf, const unsigned short *rbuflen);

void main(void)
{
	//write
	unsigned short wBuflen = 128;
	unsigned char wBuf[wBuflen] = {0};
	for(unsigned char i =0 ;i<wBuflen;i++)
	{
		wBuf[i] = i;
	}	
	int wret = i2c_write(wBuf, wBuflen);

	//read
	unsigned char rBuf[128] = {0};
	unsigned short rlen = 128;
	int rret = i2c_read(rBuf, rlen);
}

因?yàn)橹霸O(shè)置的是七位設(shè)備地址(第八位是讀寫位),所以在讀寫時(shí)需要左移一位,HAL庫(kù)中I2C的讀寫存儲(chǔ)器比較方便,只需要調(diào)用HAL_I2C_Mem_WriteHAL_I2C_Mem_Read函數(shù)即可。

int i2c_write(uint8_t devadd,uint16_t memadd,uint16_t memsize,uint8_t *pwbuf, const unsigned short wbuflen)
{
	devadd = (devadd<<1)&0xFF;
	if(pwbuf != NULL || wbuflen != 0)
	{
		if(HAL_I2C_Mem_Write(&hi2c1,devadd,memadd,memsize,pwbuf, wbuflen,0xFFFF)==HAL_OK)
		{
			return 1;
		}
	}
	else
	{
		return 0;
	}
}

int i2c_read(uint8_t devadd,uint16_t memadd,uint16_t memsize,uint8_t *prbuf, const unsigned short rbuflen)
{
	devadd = (devadd<<1)&0xFF;
	
	if(prbuf != NULL || rbuflen != 0)
	{
		if(HAL_I2C_Mem_Read(&hi2c1, devadd, memadd,memsize, prbuf,rbuflen,0xFFFF)==HAL_OK)
		{
			return 1;
		}
	}
	else
	{
		return 0;
	}
}

這兩個(gè)函數(shù)在stm32l4xx_hal_i2c.c文件下

HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress,
                                    uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress,
                                   uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)

實(shí)際實(shí)現(xiàn)示例,當(dāng)i2c開(kāi)始寫的時(shí)候,因?yàn)槭且粋€(gè)字一個(gè)字地寫,所以存儲(chǔ)器地址每次加i,即0x0000+i,并且需要延遲一會(huì),否則太快了芯片來(lái)不及存數(shù)據(jù)。
讀就直接讀,從0x0000開(kāi)始讀。

void I2C_ReadorWrite(uint8_t flag)
{
	if(flag == 1)
	{
		//write
		unsigned char i;
		uint8_t dat=0;
		if(HAL_I2C_IsDeviceReady(&hi2c1,M24C32_ADD<<1,2,0x00ff)==HAL_OK)
		{
			i=0;
		}
		unsigned short wBuflen = 128;
		for(i = 0;i<wBuflen;i++)//i2c clear
		{
			dat=0;
			i2c_write(M24C32_ADD,0x0000+i,I2C_MEMADD_SIZE_16BIT,&dat,1);
			delay_ms(10);
		}	
		for(i = 0;i<wBuflen;i++)//i2c write
		{
			dat=i;
			i2c_write(M24C32_ADD,0x0000+i,I2C_MEMADD_SIZE_16BIT,&dat,1);
			delay_ms(10);
		}	
	}
	else if(flag == 0)
	{
		//read
		unsigned char rBuf[128] = {0};
		unsigned short rlen = 128;
		i2c_read(M24C32_ADD,0x0000,I2C_MEMADD_SIZE_16BIT,rBuf,rlen);
//	for(i=0;i<rlen;i++)
//	{
//		printf("rBuf[%d] = %02X \n",i,rBuf[i]);
//	}
		//uint16_t re_dat=0;
		//i2c_write(M24C32_ADD,0x0000,I2C_MEMADD_SIZE_16BIT,&dat,1);
		//delay_ms(55);

		//i2c_write(M24C32_ADD,0x0000,I2C_MEMADD_SIZE_16BIT,&dat,1);
		//delay_ms(50);
		//i2c_read(M24C32_ADD,0x0000,I2C_MEMADD_SIZE_16BIT,&re_dat,1);
	}
}

遇到的問(wèn)題

要了解手頭這個(gè)芯片的i2c地址位數(shù),一般都是7位,在讀寫時(shí)不能忘記移位。
在存儲(chǔ)數(shù)據(jù)時(shí)記得調(diào)用delay,否則會(huì)出現(xiàn)輸出的數(shù)據(jù)有漏掉的情況。
除了這個(gè)EEPROM芯片還有一個(gè)LP87702芯片的,在熟悉中。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-768449.html

到了這里,關(guān)于【STM32L496】使用HAL庫(kù)實(shí)現(xiàn)I2C寫入/讀取數(shù)據(jù)(M24C32)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • STM32之I2C總線知識(shí)和HAL庫(kù)函數(shù)

    STM32之I2C總線知識(shí)和HAL庫(kù)函數(shù)

    一、 I2C總線知識(shí) I2C總線物理拓?fù)浣Y(jié)構(gòu) I2C 總線在物理連接上非常簡(jiǎn)單,分別由SDA(串行數(shù)據(jù)線)和SCL(串行時(shí)鐘線)及上拉電阻組成。通信原理是通過(guò)對(duì)SCL和SDA線高低電平時(shí)序的控制,來(lái) 產(chǎn)生I2C總線協(xié)議所需要的信號(hào)進(jìn)行數(shù)據(jù)的傳遞。在總線空閑狀態(tài)時(shí),這兩根線一般被上面所接

    2024年02月21日
    瀏覽(26)
  • STM32基于CubeMX與HAL庫(kù)的I2C應(yīng)用

    STM32基于CubeMX與HAL庫(kù)的I2C應(yīng)用

    1.1 物理層 ????????I2C協(xié)議和摩托羅拉公司的SPI協(xié)議一樣,是一種通訊協(xié)議。串行外圍設(shè)備接口,是一種高速全雙工的通信總線,是由 Phiilps 公司開(kāi)發(fā)的。由于它引腳少,硬件實(shí)現(xiàn)簡(jiǎn)單,可擴(kuò)展性強(qiáng),不需要 USART、CAN 等通訊協(xié)議的外部收發(fā)設(shè)備,現(xiàn)在被廣泛地使用在系統(tǒng)內(nèi)

    2024年02月21日
    瀏覽(33)
  • STM32學(xué)習(xí)筆記(十)丨I2C通信(使用I2C實(shí)現(xiàn)MPU6050和STM32之間通信)

    STM32學(xué)習(xí)筆記(十)丨I2C通信(使用I2C實(shí)現(xiàn)MPU6050和STM32之間通信)

    ???本次課程采用單片機(jī)型號(hào)為STM32F103C8T6。(鑒于筆者實(shí)驗(yàn)時(shí)身邊只有STM32F103ZET6,故本次實(shí)驗(yàn)使基于ZET6進(jìn)行的) ???課程鏈接:江協(xié)科技 STM32入門教程 ??往期筆記鏈接: ??STM32學(xué)習(xí)筆記(一)丨建立工程丨GPIO 通用輸入輸出 ??STM32學(xué)習(xí)筆記(二)丨STM32程序調(diào)試

    2024年01月19日
    瀏覽(26)
  • STM32  HAL庫(kù)硬I2C的TOF050C模塊

    STM32 HAL庫(kù)硬I2C的TOF050C模塊

    最近在倒騰畢業(yè)設(shè)計(jì),需要用到TOF050C,但是現(xiàn)有的案例都是軟IIC,并且還是基于STM32F103的,筆者用的STM32F767,沒(méi)有GPIO-CRH寄存器。問(wèn)題來(lái)了,如果我每次都要去看寄存器手冊(cè)屬實(shí)費(fèi)時(shí)間,這不干脆直接用硬IIC? 于是乎,打開(kāi)了TOF050C手冊(cè),硬啃! 這手冊(cè)好在它有工作流程圖,

    2024年02月14日
    瀏覽(23)
  • STM32設(shè)置為I2C從機(jī)模式(HAL庫(kù)版本)

    STM32設(shè)置為I2C從機(jī)模式(HAL庫(kù)版本)

    我之前出過(guò)一篇關(guān)于STM32設(shè)置為I2C從機(jī)的博客,現(xiàn)在應(yīng)粉絲要求,出一篇HAL庫(kù)版本的I2C從機(jī)編程。 基于官方庫(kù)版本的可以看下我之前發(fā)的文章:STM32設(shè)置為I2C從機(jī)模式 測(cè)試芯片:STM32F103RCT6 測(cè)試方法:用一個(gè)USB轉(zhuǎn)I2C的工具接到STM32的I2C引腳上,通過(guò)上位機(jī)工具進(jìn)行讀寫操作。如

    2024年02月12日
    瀏覽(21)
  • 【STM32CubeMX+HAL庫(kù)】I2C詳解+讀寫EEPROM

    【STM32CubeMX+HAL庫(kù)】I2C詳解+讀寫EEPROM

    在之前的標(biāo)準(zhǔn)庫(kù)中,STM32的硬件IIC非常復(fù)雜,更重要的是它并不穩(wěn)定,所以都不推薦使用。但是在我們的HAL庫(kù)中,對(duì)硬件IIC做了全新的優(yōu)化,使得之前軟件IIC幾百行代碼,在HAL庫(kù)中,只需要寥寥幾行就可以完成?那么這篇文章將帶你去感受下它的優(yōu)異之處。 通過(guò)本篇博客您將

    2024年02月03日
    瀏覽(32)
  • Clion開(kāi)發(fā)STM32之HAL庫(kù)I2C封裝(基礎(chǔ)庫(kù))

    引用參考: Clion開(kāi)發(fā)STM32之HAL庫(kù)GPIO宏定義封裝(最新版)

    2024年02月13日
    瀏覽(52)
  • 01_STM32軟件+硬件I2C讀取MPU6050(HAL庫(kù))

    01_STM32軟件+硬件I2C讀取MPU6050(HAL庫(kù))

    目錄 1、I2C簡(jiǎn)介 2、I2C時(shí)序單元 2.1 起始條件 2.2 終止條件 2.3 發(fā)送一個(gè)字節(jié) 2.4 接收一個(gè)字節(jié) 2.5 發(fā)送應(yīng)答 2.6 接收應(yīng)答 3、I2C完整時(shí)序 3.1 指定地址寫一個(gè)字節(jié) 3.2 當(dāng)前地址讀一個(gè)字節(jié) 3.2?指定地址讀一個(gè)字節(jié) 4、簡(jiǎn)單軟件I2C代碼(HAL) 4.1 軟件I2C 4.2 軟件I2C讀MPU6050寄存器 5、ST

    2024年04月17日
    瀏覽(29)
  • 【STM32】I2C練習(xí),HAL庫(kù)讀取MPU6050角度陀螺儀

    【STM32】I2C練習(xí),HAL庫(kù)讀取MPU6050角度陀螺儀

    MPU-6000(6050)為全球首例整合性6軸運(yùn)動(dòng)處理組件,相較于多組件方案,免除了組合陀螺儀與加速器時(shí)間軸之差的問(wèn)題,減少了大量的封裝空間。當(dāng)連接到三軸磁強(qiáng)計(jì)時(shí),MPU-60X0提供完整的9軸運(yùn)動(dòng)融合輸出到其主I2C或SPI端口(SPI僅在MPU-6000上可用)。 寄存器地址 寄存器內(nèi)容 0X3B

    2024年02月16日
    瀏覽(28)
  • 【STM32】AT24C256硬件I2C讀寫,基于HAL庫(kù)

    【STM32】AT24C256硬件I2C讀寫,基于HAL庫(kù)

    目錄 一、簡(jiǎn)單介紹 二、配置工程 打開(kāi)CubeMX,配置時(shí)鐘,調(diào)試接口,工程名,目錄等 配置iic 配置串口用于顯示信息 三、硬件連接 四、代碼編寫 一、隨機(jī)寫入一個(gè)字節(jié) 測(cè)試代碼 波形如下 代碼編寫 二、連續(xù)寫入 代碼如下 三、隨機(jī)讀取 測(cè)試代碼 波形如下 代碼編寫 四、連續(xù)

    2024年02月03日
    瀏覽(41)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包