在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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(附源代碼)

如意 ? 來源:CSDN、博客園 ? 作者:CSDN、博客園 ? 2021-07-23 10:55 ? 次閱讀

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

I2C英文名為inter-Integrated Circuit,是用于多設(shè)備通訊的兩線式串行總線,分為主機(jī)Master和從機(jī)Slave,通常有一個(gè)主機(jī)和多個(gè)從機(jī),從機(jī)之間可通過地址進(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)到來

//返回值: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ī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • STM32
    +關(guān)注

    關(guān)注

    2270

    文章

    10918

    瀏覽量

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

    關(guān)注

    96

    文章

    2946

    瀏覽量

    66837
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    I2C總線與Arduino的接口示例

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

    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 ?96次閱讀

    AN-840: 通過I2C接口更新代碼

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

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

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

    RISC V的I2C操作

    _scl_write(system_i2c_0_io_scl_write),.system_i2c_0_io_scl_read(system_i2c_0_io_scl_read),WriteEnable信號(hào)的處理
    的頭像 發(fā)表于 11-01 11:06 ?246次閱讀

    了解I2C總線

    電子發(fā)燒友網(wǎng)站提供《了解I2C總線.pdf》資料免費(fèi)下載
    發(fā)表于 10-08 11:13 ?2次下載
    了解<b class='flag-5'>I2C</b>總線

    I2C基本指南

    電子發(fā)燒友網(wǎng)站提供《I2C基本指南.pdf》資料免費(fèi)下載
    發(fā)表于 09-10 09:40 ?0次下載
    <b class='flag-5'>I2C</b>基本指南

    如何通過I2C加載TPS2388x SRAM和奇偶校驗(yàn)代碼

    電子發(fā)燒友網(wǎng)站提供《如何通過I2C加載TPS2388x SRAM和奇偶校驗(yàn)代碼.pdf》資料免費(fèi)下載
    發(fā)表于 09-06 11:16 ?0次下載
    如何通過<b class='flag-5'>I2C</b>加載TPS2388x SRAM和奇偶校驗(yàn)<b class='flag-5'>代碼</b>

    在用STM32的SPI和I2C時(shí),是用I/O模擬還是片內(nèi)外設(shè)?

    大家一起來聊一聊在用STM32的SPI和I2C時(shí),用I/O模擬多些還是片內(nèi)外設(shè),用查詢方式還是中斷方式。
    發(fā)表于 05-16 08:29

    請(qǐng)問數(shù)字(硬件)I2C模擬I2C的優(yōu)缺點(diǎn)?

    請(qǐng)教哈各位同仁: 1. 數(shù)字(硬件)I2C模擬I2C的優(yōu)缺點(diǎn)? 2.他們?cè)谡DJ较碌墓膶?duì)比,哪個(gè)較好?
    發(fā)表于 05-13 06:10

    如何根據(jù)時(shí)序圖編寫高效IO模擬I2C程序

    I2C的讀寫字節(jié)是這么定義的:當(dāng)時(shí)鐘線為低電平的時(shí)候,允許修改數(shù)據(jù)線的電平狀態(tài),在時(shí)鐘線為高電平的時(shí)候讀取數(shù)據(jù)線的狀態(tài)。
    的頭像 發(fā)表于 04-06 03:05 ?4094次閱讀
    如何根據(jù)時(shí)序圖編寫高效<b class='flag-5'>IO</b><b class='flag-5'>模擬</b><b class='flag-5'>I2C</b>程序

    STM32F103普通IO模擬通信協(xié)議如I2C,SPI,串口,怎么精準(zhǔn)的控制通訊的速率?

    STM32F103普通IO模擬通信協(xié)議如I2C,SPI,串口等。 怎么精準(zhǔn)的控制通訊的速率,我看到STLINK也是用的STM32的芯片,為
    發(fā)表于 03-28 08:24

    stm32f4軟件模擬I2C讀寫EEPROM無器件響應(yīng)是什么原因造成的?

    利用STM32F4軟件模擬I2C讀寫EEPROM時(shí),在檢測(cè)I2C總線設(shè)備時(shí),在等待應(yīng)答階段,CPU讀取SDA線狀態(tài)值為1(GPIO_Rea
    發(fā)表于 03-19 06:36

    什么是I2C協(xié)議 I2C總線的控制邏輯

    在實(shí)際使用過程中,I2C比較容易出現(xiàn)的一個(gè)問題就是死鎖 ,死鎖在I2C中主要表現(xiàn)為:I2C死鎖時(shí)表現(xiàn)為SCL為高,SDA一直為低。
    發(fā)表于 03-12 09:17 ?1137次閱讀
    什么是<b class='flag-5'>I2C</b>協(xié)議 <b class='flag-5'>I2C</b>總線的控制邏輯

    GD32 MCU硬件I2C不可靠不如軟件I2C?來看看紅楓派開發(fā)版的硬件I2C驅(qū)動(dòng)如何做到穩(wěn)得一批

    在一個(gè)評(píng)論中,看到網(wǎng)友對(duì)硬件I2C的討論,硬件I2C Busy找不到原因、軟件I2C穩(wěn)得一批。
    的頭像 發(fā)表于 02-23 09:37 ?2856次閱讀
    GD32 MCU硬件<b class='flag-5'>I2C</b>不可靠不如軟件<b class='flag-5'>I2C</b>?來看看紅楓派開發(fā)版的硬件<b class='flag-5'>I2C</b>驅(qū)動(dòng)如何做到穩(wěn)得一批
    主站蜘蛛池模板: 97爱sese| 在线观看国产久青草| 免费一看一级毛片全播放| 亚洲网站色| 网色视频| 天天艹夜夜| 欧美日韩伦理| 高清在线观看视频| 亚洲va老文色欧美黄大片人人| 欧美人与z0zoxxxx| 亚洲第一黄色网| 有一婷婷色| 色五月激情五月| 免费看一级视频| 国产成视频| 天天综合天天看夜夜添狠狠玩| 噜噜噜动态图超猛烈| 98色花堂永久地址国产精品| h国产在线| 在线观看国产精美视频| 三级黄色网址| 国产一区在线播放| 午夜啪| 国产精品午夜国产小视频| 中文字幕一区二区三区 精品 | 人与牲动交xxxxbbb| 久久婷婷一区二区三区| 最新午夜| 黄黄网| 乌克兰一级毛片| 四虎精品永久在线| 久久电影福利| 午夜免费毛片| 白浆喷射| 卡1卡2卡3精品推荐老狼| 婷婷狠狠| 韩国三级久久精品| 天天操天天舔| 91网站免费在线观看| 香蕉爱爱视频| 国产三级在线观看免费|