chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

I2C英文名為inter-Integrated Circuit,是用于多設(shè)備通訊的兩線式串行總線,分為主機(jī)Master和從機(jī)Slave,通常有一個(gè)主機(jī)和多個(gè)從機(jī),從機(jī)之間可通過(guò)地址進(jìn)行區(qū)分,不同種類的設(shè)備地址不同。I2C分別是時(shí)鐘線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起始信號(hào)

//SCL為高電平時(shí)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停止信號(hào)

//SCL為高電平時(shí)SDA由低變高

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

void IIC_Stop(void)

{

IIC_SDA_0;

IIC_SCL_1;

delay_us(4);

IIC_SDA_1;

}

//等待應(yīng)答信號(hào)到來(lái)

//返回值: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為高電平時(shí)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為高電平時(shí)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ā)送一個(gè)字節(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個(gè)字節(jié),ack=1時(shí),發(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的源代碼,希望對(duì)用戶有所幫助。

本文整合自CSDN、博客園

責(zé)編AJX

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(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)投訴
  • STM32
    +關(guān)注

    關(guān)注

    2305

    文章

    11118

    瀏覽量

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

    關(guān)注

    96

    文章

    2953

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

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

    深入剖析I2C協(xié)議

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

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

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

    第十八章 I2C通信測(cè)試

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

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

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

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

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

    I2C總線復(fù)用

    帝晶智慧屏I2C總線復(fù)用
    的頭像 發(fā)表于 03-11 17:20 ?1843次閱讀

    I2C總線通信原理 如何設(shè)計(jì)I2C總線電路

    I2C總線通信原理 I2C(Inter-Integrated Circuit)總線是一種用于集成電路之間進(jìn)行通信的串行通信協(xié)議。它最早由飛利浦公司(現(xiàn)被恩智浦電子收購(gòu))于1982年推出,是一種簡(jiǎn)單
    的頭像 發(fā)表于 01-31 15:01 ?1857次閱讀

    I2C總線與Arduino的接口示例

    在現(xiàn)代電子設(shè)計(jì)中,I2C總線因其簡(jiǎn)單性和靈活性而廣受歡迎。它允許多個(gè)設(shè)備共享同一通信線路,從而節(jié)省空間和成本。Arduino,作為一個(gè)多功能的微控制器平臺(tái),自然也支持I2C通信。 I2C總線
    的頭像 發(fā)表于 01-17 15:34 ?2338次閱讀

    I2C總線的工作模式介紹

    在現(xiàn)代電子系統(tǒng)中,I2C總線作為一種多主機(jī)、多從機(jī)的串行通信協(xié)議,扮演著至關(guān)重要的角色。它允許多個(gè)設(shè)備共享同一總線,進(jìn)行數(shù)據(jù)傳輸,從而簡(jiǎn)化了系統(tǒng)設(shè)計(jì)并降低了成本。 I2C總線的基本特性 I2C總線由
    的頭像 發(fā)表于 01-17 15:32 ?1617次閱讀

    I2C總線故障排除技巧

    I2C總線是一種廣泛使用的串行通信協(xié)議,它允許多個(gè)設(shè)備在兩條線上(數(shù)據(jù)線SDA和時(shí)鐘線SCL)進(jìn)行通信。由于其簡(jiǎn)單性和靈活性,I2C總線在嵌入式系統(tǒng)中非常流行。然而,當(dāng)I2C總線出現(xiàn)問(wèn)題時(shí),可能會(huì)
    的頭像 發(fā)表于 01-17 15:20 ?3807次閱讀

    I2C總線應(yīng)用實(shí)例分析

    在現(xiàn)代電子系統(tǒng)中,I2C總線因其簡(jiǎn)單、靈活和高效的特點(diǎn)而被廣泛應(yīng)用于各種設(shè)備之間的通信。 I2C總線概述 I2C總線由Philips(現(xiàn)為NXP)在1980年代初期開發(fā),最初用于音頻和視頻設(shè)備
    的頭像 發(fā)表于 01-17 15:09 ?1224次閱讀

    AN-840: 通過(guò)I2C接口更新代碼

    電子發(fā)燒友網(wǎng)站提供《AN-840: 通過(guò)I2C接口更新代碼.pdf》資料免費(fèi)下載
    發(fā)表于 01-15 16:04 ?0次下載
    AN-840: 通過(guò)<b class='flag-5'>I2C</b>接口更新<b class='flag-5'>代碼</b>

    使用stm32f103io來(lái)做i2c通訊,直接讀取cdce913寄存器的數(shù)據(jù)每次讀取到的數(shù)據(jù)都是7,為什么?

    使用stm32f103io來(lái)做i2c通訊,我已確保的是協(xié)議是沒有問(wèn)題的(移植到開發(fā)板上做過(guò)at24c02的存儲(chǔ),但是我使用在cdce913上就不可以操作,我嘗試直接讀取cdce9
    發(fā)表于 12-31 08:05

    使用GPIO模擬I2C的電路設(shè)計(jì)

    Questions:當(dāng)使用GPIO模擬I2C時(shí)應(yīng)如何進(jìn)行電路設(shè)計(jì)?Answer: I2C協(xié)議中規(guī)定了總線上任意器件輸出低電平都會(huì)將總線拉低,也就是總線上各器件是通過(guò)線“與”的方式來(lái)連接的。所以
    發(fā)表于 12-23 11:20