91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

STM32 IO口模擬I2C(附源代碼)

如意 ? 來源:CSDN、博客園 ? 作者:CSDN、博客園 ? 2021-07-23 10:55 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

STM32 IO口模擬I2C(附源代碼)

I2C英文名為inter-Integrated Circuit,是用于多設(shè)備通訊的兩線式串行總線,分為主機(jī)Master和從機(jī)Slave,通常有一個主機(jī)和多個從機(jī),從機(jī)之間可通過地址進(jìn)行區(qū)分,不同種類的設(shè)備地址不同。I2C分別是時鐘線SCL和數(shù)據(jù)線SDA,其中SCL和SDA由主機(jī)控制,可設(shè)置成開漏輸出模式。

STM32 IO口模擬I2C實(shí)例代碼1:

#define IIC_SCL_1 GPIO_SetBits(GPIOB, GPIO_Pin_6) /* SCL = 1 */

#define IIC_SCL_0 GPIO_ResetBits(GPIOB, GPIO_Pin_6) /* SCL = 0 */

#define IIC_SDA_1 GPIO_SetBits(GPIOB, GPIO_Pin_7) /* SDA = 1 */

#define IIC_SDA_0 GPIO_ResetBits(GPIOB, GPIO_Pin_7) /* SDA = 0 */

#define IIC_READ_SDA() GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7) /* 讀SDA口線狀態(tài) */

//初始化IIC

void IIC_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD ; //開漏輸出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure);

IIC_Stop();

}

//產(chǎn)生IIC起始信號

//SCL為高電平時SDA由高變低

void IIC_Start(void)

{

IIC_SDA_1;

IIC_SCL_1;

delay_us(4);

IIC_SDA_0;

delay_us(4);

IIC_SCL_0;

}

//產(chǎn)生IIC停止信號

//SCL為高電平時SDA由低變高

//IIC空閑時SCL和SDA均輸出高電平,這樣不會干擾其他設(shè)備的收發(fā)

void IIC_Stop(void)

{

IIC_SDA_0;

IIC_SCL_1;

delay_us(4);

IIC_SDA_1;

}

//等待應(yīng)答信號到來

//返回值:1,接收應(yīng)答失敗

// 0,接收應(yīng)答成功

uint8_t IIC_WaitAck(void)

{

uint8_t errCount = 0;

uint8_t ack = 0;

IIC_SDA_1;

delay_us(4);

IIC_SCL_1;

delay_us(4);

while(IIC_READ_SDA())

{

errCount++;

if(errCount 》 250){

ack = 1;

break;

}

}

IIC_SCL_0;

return ack;

}

//產(chǎn)生應(yīng)答ACK

//SCL為高電平時SDA為低電平表示應(yīng)答

void IIC_Ack(void)

{

IIC_SDA_0;

delay_us(4);

IIC_SCL_1;

delay_us(4);

IIC_SCL_0;

delay_us(4);

IIC_SDA_1; //釋放SDA

}

//產(chǎn)生非應(yīng)答NACK

//SCL為高電平時SDA為高電平表示非應(yīng)答

void IIC_NAck(void)

{

IIC_SDA_1;

delay_us(4);

IIC_SCL_1;

delay_us(4);

IIC_SCL_0;

delay_us(4);

}

//IIC發(fā)送一個字節(jié)

void IIC_WriteByte(uint8_t txd)

{

uint8_t i;

IIC_SCL_0;

for(i = 0; i 《 8; i++)

{

(txd & 0x80) ? IIC_SDA_1 : IIC_SDA_0;

txd 《《= 1;

delay_us(4);

IIC_SCL_1;

delay_us(4);

IIC_SCL_0;

delay_us(4);

}

IIC_SDA_1;

}

//讀1個字節(jié),ack=1時,發(fā)送ACK,ack=0,發(fā)送NACK

uint8_t IIC_ReadByte(uint8_t ack)

{

uint8_t i, rcv = 0;

for(i = 0; i 《 8; i++)

{

rcv 《《= 1;

IIC_SCL_1;

delay_us(4);

if(IIC_READ_SDA()){

rcv++;

}

IIC_SCL_0;

delay_us(4);

}

ack ? IIC_Ack() : IIC_NAck();

return rcv;

}

STM32 IO口模擬I2C實(shí)例代碼2:

#define I2C_Speed 100000#define I2C_EE I2C1#define uStatus 0x80#define dTime 5#define I2C_EE_GPIO GPIOB#define I2C_EE_SCL GPIO_Pin_5#define I2C_EE_SDA GPIO_Pin_4#define I2C_EE_CLK RCC_APB1Periph_I2C1#define SCL_H GPIOB-》BSRR = GPIO_Pin_5#define SCL_L GPIOB-》BRR = GPIO_Pin_5#define SDA_H GPIOB-》BSRR = GPIO_Pin_4#define SDA_L GPIOB-》BRR = GPIO_Pin_4#define SCL_read GPIOB-》IDR & GPIO_Pin_5#define SDA_read GPIOB-》IDR & GPIO_Pin_4static unsigned int cntForInitial = 0;static unsigned char fSigStatus = 0;//static bool LedStatus = true;void I2C_Init(){GPIO_InitTypeDef GPIO_InitStructure;//* Configure I2C_EE pins: SCL and SDAGPIO_InitStructure.GPIO_Pin = I2C_EE_SCL | I2C_EE_SDA;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_Init(I2C_EE_GPIO, &GPIO_InitStructure);}static void i2c_start(){SDA_H;SCL_H;DelayUs(dTime);SDA_L;DelayUs(dTime);SCL_L;DelayUs(dTime);// LedStatus = !LedStatus;//f_LCT1(LedStatus);}/*******************************************************************Fuction:Stop i2c*******************************************************************/static void i2c_stop(){SDA_L;SCL_H;DelayUs(dTime);SDA_H;DelayUs(dTime);SCL_H;DelayUs(dTime);}/*******************************************************************Fuction:i2c Master wait for ackOnly ack*******************************************************************/static unsigned char i2c_rd_ack(){unsigned char flag = 0;SDA_H;SCL_H;DelayUs(dTime/2);flag = SDA_read;DelayUs(dTime/2);SCL_L;DelayUs(dTime/2);if(flag == 1)return 0;return 1;}/*******************************************************************Fuction:i2c Byte transmissionOnly Send,no ack,no stop*******************************************************************/static unsigned char i2c_sb(unsigned char Byte){unsigned char cnt;SCL_L;for(cnt=0;cnt《8;cnt++){if(Byte&0x80)SDA_H;elseSDA_L;DelayUs(dTime);SCL_H;DelayUs(dTime);SCL_L;Byte 《《= 1;DelayUs(dTime);}return i2c_rd_ack();}/*******************************************************************Fuction:i2c Byte receiveReturn Byte*******************************************************************/static unsigned char i2c_rb(){unsigned char cnt;unsigned char Byte=0;SDA_H;for(cnt=0;cnt《8;++cnt){Byte 《《= 1;DelayUs(dTime);SCL_H;DelayUs(dTime);if(SDA_read)Byte |= 0x01;SCL_L;DelayUs(dTime);}return Byte;}/*******************************************************************Fuction:i2c ACK Master send*******************************************************************/static void i2c_wr_ack(unsigned char ACK){if(ACK)SDA_H;elseSDA_L;SCL_H;DelayUs(dTime);SCL_L;DelayUs(dTime);}/*******************************************************************Fuction:i2c Byte receiveReturn Byte*******************************************************************/uint8_t ReadReg(unsigned int addr){uint8_t temp;i2c_start();if(!i2c_sb(BRG_DEV_ADDR)){i2c_stop();return 0;}if(!i2c_sb((uint8_t)(addr 》》 8))){i2c_stop();return 0;}if(!i2c_sb((uint8_t)(addr & 0xFF))){i2c_stop();return 0;}i2c_start();if(!i2c_sb(BRG_DEV_ADDR |0x01)){i2c_stop();return 0;}temp = i2c_rb();i2c_wr_ack(1);i2c_stop();return temp;}unsigned char WriteReg8(unsigned int addr,unsigned char wData){i2c_start();if(!i2c_sb(BRG_DEV_ADDR)){i2c_stop();return 0;}if(!i2c_sb((unsigned char)(addr 》》 8))){i2c_stop();return 0;}if(!i2c_sb((unsigned char)(addr & 0xFF))){i2c_stop();return 0;}if(!i2c_sb((unsigned char)(wData))){i2c_stop();return 0;}i2c_stop();//DelayUs(1);return 1; }unsigned char WriteReg16(unsigned int addr,unsigned char wData1,unsigned char wData2){i2c_start();if(!i2c_sb(BRG_DEV_ADDR)){i2c_stop();return 0;}if(!i2c_sb((unsigned char)(addr 》》 8))){i2c_stop();return 0;}if(!i2c_sb((unsigned char)(addr & 0xFF))){i2c_stop();return 0;}if(!i2c_sb((unsigned char)(wData2))){i2c_stop();return 0;}if(!i2c_sb((unsigned char)(wData1))){i2c_stop();return 0;}i2c_stop();DelayUs(1);return 1; }unsigned char WriteReg32(unsigned int addr,unsigned char wData1,unsigned char wData2,unsigned char wData3,unsigned char wData4){i2c_start();if(!i2c_sb(BRG_DEV_ADDR)){i2c_stop();return 0;}if(!i2c_sb((unsigned char)(addr 》》 8))){i2c_stop();return 0;}if(!i2c_sb((unsigned char)(addr & 0xFF))){i2c_stop();return 0;}if(!i2c_sb((unsigned char)(wData4))){i2c_stop();return 0;}if(!i2c_sb((unsigned char)(wData3))){i2c_stop();return 0;}if(!i2c_sb((unsigned char)(wData2))){i2c_stop();return 0;}if(!i2c_sb((unsigned char)(wData1))){i2c_stop();return 0;}i2c_stop();DelayUs(1);return 1;}

以上是STM32 IO口模擬I2C的源代碼,希望對用戶有所幫助。

本文整合自CSDN、博客園

責(zé)編AJX

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

    關(guān)注

    2310

    文章

    11172

    瀏覽量

    373789
  • 源代碼
    +關(guān)注

    關(guān)注

    96

    文章

    2953

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    I2C 為什么只要兩根線就能搞定通信?

    到目前為止,我們已經(jīng)討論了SPI通信和UART通信的基礎(chǔ)知識,現(xiàn)在讓我們討論本系列的最后一個協(xié)議,即集成電路間協(xié)議(I2C)。如果您曾經(jīng)構(gòu)建過使用OLED顯示器、氣壓傳感器或陀螺儀/加速度計模塊
    的頭像 發(fā)表于 01-04 09:14 ?1772次閱讀
    <b class='flag-5'>I2C</b> 為什么只要兩根線就能搞定通信?

    基于FPGA的I2C控制模塊設(shè)計

    I2C_WRITE_WDATA.v模塊實(shí)現(xiàn)I2C寫時序,I2C_Controller (I2C控制器)例化了I2C_WRITE_WDATA.
    的頭像 發(fā)表于 12-26 09:48 ?5270次閱讀
    基于FPGA的<b class='flag-5'>I2C</b>控制模塊設(shè)計

    AS32X601的I2C模塊操作EEPROM詳解

    國科安芯推出的AS32X601系列MCU芯片內(nèi)置的I2C模塊提供了符合工業(yè)標(biāo)準(zhǔn)的兩線串行制接口,可用于MCU和外部I2C設(shè)備的通訊。I2C總線使用兩條串行線:串行數(shù)據(jù)線SDA和串行時鐘線SCL
    的頭像 發(fā)表于 12-21 21:39 ?1121次閱讀
    AS32X601的<b class='flag-5'>I2C</b>模塊操作EEPROM詳解

    HTR3355 I2C和SMBus IO擴(kuò)展器產(chǎn)品詳解

    ? ? ? 在現(xiàn)代電子系統(tǒng)設(shè)計中,IO端口資源不足是常見的設(shè)計瓶頸,而一款性能穩(wěn)定、適配性強(qiáng)的IO擴(kuò)展器能夠有效突破這一限制。HTR3355作為一款集成I2C和SMBus雙接口的IO擴(kuò)
    的頭像 發(fā)表于 12-18 16:40 ?571次閱讀
    HTR3355 <b class='flag-5'>I2C</b>和SMBus <b class='flag-5'>IO</b>擴(kuò)展器產(chǎn)品詳解

    I2C死鎖的問題

    在實(shí)際使用過程中,I2C比較容易出現(xiàn)的一個問題就是死鎖 ,死鎖在I2C中主要表現(xiàn)為:I2C死鎖時表現(xiàn)為SCL為高,SDA一直為低。 在I2C主設(shè)備進(jìn)行讀寫操作的過程中,主設(shè)備在開始信
    發(fā)表于 12-04 06:00

    IO8種工作模式和應(yīng)用

    ,比如在輸入端加100nF濾波電容。 典型應(yīng)用: 采集傳感器模擬信號或分壓后的電源電壓以此來監(jiān)控電源。 輸出模式(Output Mode) 描述: IO配置為向外部設(shè)備發(fā)送信號如I2C
    發(fā)表于 11-14 06:46

    深入剖析I2C協(xié)議

    ,I2C也是一種可以多主設(shè)備,多從設(shè)備的總線協(xié)議,通過地址索引,I2C可以使能所需從設(shè)備,I2C的出現(xiàn)主要是用來實(shí)現(xiàn)不同集成電路組件之間的控制功能,比如通過I2C協(xié)議,連接MCU與LC
    的頭像 發(fā)表于 08-21 15:10 ?3725次閱讀
    深入剖析<b class='flag-5'>I2C</b>協(xié)議

    I2C通信異常問題怎么解決?

    我們在進(jìn)行I2C通信,發(fā)現(xiàn)當(dāng)寫數(shù)據(jù)時SCL和SDA會有下降沿重合的情況,導(dǎo)致通信失敗,請幫忙分析下如何處理? I2C通信代碼如下: static bool PS8740_I2C_Wr
    發(fā)表于 08-12 07:45

    在linux系統(tǒng)中,通過I2C和CCG5通訊,有沒有和CCG5通過I2C進(jìn)行固件升級?狀態(tài)配置的有沒有可以參考的源代碼?

    在linux系統(tǒng)中,通過I2C和CCG5通訊,有沒有和CCG5通過I2C進(jìn)行固件升級,狀態(tài)配置的 有沒有可以參考的源代碼? 固件升級是在linux kernel里面實(shí)現(xiàn) 還是在用戶空間 通過 訪問
    發(fā)表于 07-17 06:59

    第十八章 I2C通信測試

    本章介紹了I2C協(xié)議,其物理層用SDA和SCL雙線,支持多設(shè)備:協(xié)議層含起始/停止信號、應(yīng)答機(jī)制等。還講解W55MH32的I2C外設(shè)及初始化,并進(jìn)行了通信測試代碼的分析。
    的頭像 發(fā)表于 06-19 17:07 ?1346次閱讀
    第十八章 <b class='flag-5'>I2C</b>通信測試

    基于STM32的衛(wèi)星GPS路徑記錄儀(完整源代碼)實(shí)例項目下載

    基于STM32的衛(wèi)星GPS路徑記錄儀(完整源代碼)實(shí)例項目推薦下載!
    發(fā)表于 05-29 21:35

    FX2 I2C代碼掛起的原因?

    我編寫了一段簡單的代碼,通過 I2C 訪問 esp8266。 bilnk led 和 i2c_write ; LOOP 當(dāng) SDL 沒有連接到 ESP8266 時,循環(huán)重復(fù)(LED 閃爍,我可以在
    發(fā)表于 05-26 08:09

    基于STM32的衛(wèi)星GPS路徑記錄儀(完整源代碼

    基于STM32的衛(wèi)星GPS路徑記錄儀(完整源代碼) 項目實(shí)例下載! 純分享帖,需要者可點(diǎn)擊附件免費(fèi)獲取完整資料~~~【免責(zé)聲明】本文系網(wǎng)絡(luò)轉(zhuǎn)載,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問題,請第一時間告知,刪
    發(fā)表于 05-23 20:48

    簡單了解I2C接口

    在電子電路的復(fù)雜世界里,各種電路模塊設(shè)備需要相互通信才能協(xié)同工作 ,I2C接口就像是電路模塊設(shè)備間的溝通橋梁,今天就帶大家深入了解它。
    的頭像 發(fā)表于 05-08 14:15 ?2635次閱讀
    簡單了解<b class='flag-5'>I2C</b>接口

    HTR33xx具有中斷功能的16位I2C和SMBus IO擴(kuò)展器中文手冊

    IO端口配置默認(rèn)為輸入,并可通過I2C進(jìn)行相關(guān)配置,如輸入或輸出選擇、反極性等配置所有配置為輸入的IO端口都會持續(xù)監(jiān)控狀態(tài)變化,10的變化由INTN輸出指示。當(dāng)
    發(fā)表于 04-14 16:25 ?0次下載