日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单片机GPIO软件模拟I2C通讯程序

發布時間:2025/4/16 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单片机GPIO软件模拟I2C通讯程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.





文章原始地址:http://feotech.com/?p=98




本程序主要用于使用可編程芯片自身的IO管腳,模擬I2C通信的協議,實現I2C總線數據的傳輸.

/********************************************************************************* @file Virtual_I2C.C * @author Ryan Zhao* @version V1.0.0* @date 2017-04-20* @brief 軟件I/O模擬I2C總線通訊.******************************************************************************* @attention Null* *******************************************************************************//** * @brief I2C引腳初始化. * @param None. * @retval None. */ void I2C_Init(void) { GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );//使能GPIOB時鐘GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); //PB6,PB7 輸出高 }/** * @brief 產生I2C開始信號. * @param None. * @retval None. */ void I2C_Start(void) {SDA_OUT(); //SDA引腳設置為輸出模式I2C_SDA_H; //SDA引腳設置為高電平 I2C_SCL_H; //SCL引腳設置為高電平 Delay(); //軟件延時I2C_SDA_L;Delay(); //軟件延時I2C_SCL_L; //準備發送或接收數據 } /** * @brief 產生I2C停止信號. * @param None. * @retval None. */ void I2C_Stop(void) {SDA_OUT();//SDA引腳設置為輸出模式I2C_SCL_l;I2C_SDA_l;Delay(); //軟件延時I2C_SCL_H; I2C_SDA_H;Delay(); }/** * @brief 等待ACK信號. * @param None. * @retval 1:接收應答成功;0:接收應答失敗; */ unsigned char I2C_Wait_Ack(void) {unsigned char ucErrTime=0;SDA_IN(); //SDA引腳設置為輸入模式 I2C_SDA_H;Delay(); I2C_SCL_H;Delay(); while(READ_SDA)//讀取SDA引腳電平狀態{ucErrTime++;if(ucErrTime>250){I2C_Stop();return 0; //接收應答失敗}}I2C_SCL_L; return 1; //接收應答成功 } /** * @brief 產生ACK信號. * @param None. * @retval None. */ void I2C_Ack(void) {I2C_SCL_L;SDA_OUT(); //SDA引腳設置為輸出模式I2C_SDA_L;Delay(); I2C_SCL_H;Delay(); I2C_SCL_L; }/** * @brief 不產生ACK信號. * @param None. * @retval None. */ void I2C_NAck(void) {I2C_SCL_L;SDA_OUT();I2C_SDA_H;Delay();I2C_SCL_H;Delay();I2C_SCL_L; } /** * @brief I2C發送一個字節. * @param None. * @retval None. */ void I2C_Send_Byte(unsigned char txd) { unsigned char i; SDA_OUT(); I2C_SCL_L;for(i=0;i<8;i++){ if((txd&0x80)>>7){I2C_SDA_H;}else{I2C_SDA_L;}txd = txd<<1; Delay();I2C_SCL_H;Delay();I2C_SCL_L; Delay();} } /** * @brief I2C讀取一個字節. * @param None. * @retval 讀取到的數據 */ unsigned char I2C_Read_Byte(unsigned char ack) {unsigned char i,receive=0;SDA_IN();//SDA設置為輸入for(i=0;i<8;i++ ){I2C_SCL=0; Delay();I2C_SCL=1;receive<<=1;if(READ_SDA){receive++; }Delay();} if (!ack){I2C_NAck();//發送nACK}else{I2C_Ack(); //發送ACK }return receive; }

總結

以上是生活随笔為你收集整理的单片机GPIO软件模拟I2C通讯程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。