精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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

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

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

STM32 IO口模擬I2C實例代碼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();

}

//產生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;

}

//產生IIC停止信號

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

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

void IIC_Stop(void)

{

IIC_SDA_0;

IIC_SCL_1;

delay_us(4);

IIC_SDA_1;

}

//等待應答信號到來

//返回值:1,接收應答失敗

// 0,接收應答成功

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;

}

//產生應答ACK

//SCL為高電平時SDA為低電平表示應答

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

}

//產生非應答NACK

//SCL為高電平時SDA為高電平表示非應答

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實例代碼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、博客園

責編AJX

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

    關注

    2266

    文章

    10876

    瀏覽量

    354923
  • 源代碼
    +關注

    關注

    96

    文章

    2944

    瀏覽量

    66673
收藏 人收藏

    評論

    相關推薦

    RISC V的I2C操作

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

    了解I2C總線

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

    I2C基本指南

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

    如何通過I2C加載TPS2388x SRAM和奇偶校驗代碼

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

    CAN轉I2C橋接器

    電子發(fā)燒友網(wǎng)站提供《CAN轉I2C橋接器.pdf》資料免費下載
    發(fā)表于 08-28 11:10 ?0次下載
    CAN轉<b class='flag-5'>I2C</b>橋接器

    在用STM32的SPI和I2C時,是用I/O模擬還是片內外設?

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

    請問數(shù)字(硬件)I2C模擬I2C的優(yōu)缺點?

    請教哈各位同仁: 1. 數(shù)字(硬件)I2C模擬I2C的優(yōu)缺點? 2.他們在正常模式下的功耗對比,哪個較好?
    發(fā)表于 05-13 06:10

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

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

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

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

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

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

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

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

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

    在一個評論中,看到網(wǎng)友對硬件I2C的討論,硬件I2C Busy找不到原因、軟件I2C穩(wěn)得一批。
    的頭像 發(fā)表于 02-23 09:37 ?2713次閱讀
    GD32 MCU硬件<b class='flag-5'>I2C</b>不可靠不如軟件<b class='flag-5'>I2C</b>?來看看紅楓派開發(fā)版的硬件<b class='flag-5'>I2C</b>驅動如何做到穩(wěn)得一批

    請問NUC970的I2C的Software Mode怎么使用?

    Cn_SWR)寄存器中的SDW,SCW是否和使用IO模擬I2C一樣, 通過操作這兩個位產生START, STOP, READ等指令? 2.
    發(fā)表于 01-17 06:28

    stm32 I2c硬件驅動程序不穩(wěn)定該怎么解決?

    stm32 I2c硬件驅動程序不穩(wěn)定該怎么解決? stm32I2C 硬件驅動程序不穩(wěn)定可能是由多種因素引起的。在本文中,我們將討論可能導致 I
    的頭像 發(fā)表于 01-16 17:11 ?2859次閱讀

    使用兩片ADU360進行I2C通信,當與從機進行通信時,從機無法進入I2C中斷是為什么?

    問題說明:使用兩片ADU360進行I2C通信,主機使用IO模擬方式,從機使用內部外設 主機IO
    發(fā)表于 01-15 06:47