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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

STM32 软件模拟 IIC 代码,标准库、HAL库可用

發布時間:2023/12/10 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32 软件模拟 IIC 代码,标准库、HAL库可用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 #ifndef _IIC_H 2 #define _IIC_H 3 4 #include "stdio.h" 5 #include "stm32f1xx_hal.h" 6 7 8 /* 定義控制 SDA SCL 的宏 標準庫版 9 #define I2C_SDA_UP GPIO_SetBits (GPIOC,GPIO_PIN_8) //SDA高電平 10 #define I2C_SDA_LOW GPIO_ResetBits(GPIOC,GPIO_PIN_8) //SDA低電平 11 #define I2C_SCL_UP GPIO_SetBits (GPIOC,GPIO_PIN_9) //SCL高電平 12 #define I2C_SCL_LOW GPIO_ResetBits(GPIOC,GPIO_PIN_9) //SCL低電平 13 */ 14 15 16 /* 定義控制 SDA SCL 的宏 HAL庫版 */ 17 18 #define I2C_SDA_UP HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET) //SDA高電平 19 #define I2C_SDA_LOW HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET) //SDA低電平 20 #define I2C_SCL_UP HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_SET) //SCL高電平 21 #define I2C_SCL_LOW HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_RESET) //SCL低電平 22 23 24 25 /* 獲取 SDA SCL 引腳狀態,標準庫版也是用相同邏輯 */ 26 27 #define I2C_SDA HAL_GPIO_ReadPin(GPIOC ,GPIO_PIN_8) //獲取SDA引腳狀態 28 #define I2C_SCL HAL_GPIO_ReadPin(GPIOC ,GPIO_PIN_9) //獲取SCL引腳狀態 29 30 31 void iic_stare(void); //* 開始信號 32 void i2c_ack(void); //* 應答信號 33 void I2C_No_ack(void); //* 非應答信號 34 void i2c_stop(void); //* 停止信號 35 char i2c_wit_ack(void); //* 等待應答 36 void i2c_send(uint8_t dat); //* 發送數據 37 uint8_t i2c_read(void); //* 接收數據 38 39 void SDA_OUT(void); //* SDA 設置為輸出 40 void SDA_IN(void); //* SDA 設置為輸入 41 42 void delay_us(uint32_t i); //*延時 43 44 #endif /***************************************************************************** * * * File: 軟件模擬IIC, HAL庫版本,標準庫也 * * 可用,只需要做一些相對應修改即可 * * * *****************************************************************************/#include "iic.h"/******************************************************************************* * 函 數 名 : i2c_stare * 函數功能 : iic開始信號,SCL高電平時,SDA出現一個下跳沿表示啟動信號 * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void i2c_stare(void) {SDA_OUT(); I2C_SDA_UP;I2C_SCL_UP;delay_us(4);I2C_SDA_LOW; //啟動開始信號delay_us(4);I2C_SCL_LOW; //鉗住I2C總線,準備發送或接收數據 }/******************************************************************************* * 函 數 名 : i2c_stop * 函數功能 : iic停止信號,SCL高電平時,SDA出現一個上跳沿表示停止信號 * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void i2c_stop(void) {SDA_OUT(); //sda線輸出I2C_SDA_LOW; //發送結束條件的數據信號 I2C_SCL_UP;delay_us(4); //結束條件建立時間大于4μI2C_SDA_UP; //發送I2C總線結束信號delay_us(4);I2C_SCL_LOW; }/******************************************************************************* * 函 數 名 : i2c_send * 函數功能 : iic發送數據 * 輸 入 : uint8_t dat,要發送的數據 * 輸 出 : 無 *******************************************************************************/ void i2c_send(uint8_t dat) {unsigned char temp;SDA_OUT();for(temp=0x80;temp!=0;temp>>=1){if((temp & dat)== 0){I2C_SDA_LOW;}else{I2C_SDA_UP;}delay_us(1);I2C_SCL_UP;delay_us(4);I2C_SCL_LOW;} }/******************************************************************************* * 函 數 名 : i2c_read * 函數功能 : iic接收數據 * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ uint8_t i2c_read(void) {unsigned char temp;unsigned char dat;I2C_SDA_UP; //釋放總線準備接收 SDA_IN();for(temp=0x80;temp!=0;temp>>=1){delay_us(1);I2C_SCL_UP;if(I2C_SDA==1){dat|=temp;}else{dat&=~temp;}I2C_SCL_LOW;}return dat; }/******************************************************************************* * 函 數 名 : i2c_wit_ack * 函數功能 : iic等待應答 * 輸 入 : 無 * 輸 出 : 0/1,返回1表示無應答信號,返回0表示應答 *******************************************************************************/ char i2c_wit_ack(void) {uint8_t con=0;I2C_SDA_UP; //釋放數據線,準備接收應答delay_us(1);I2C_SCL_UP; //CPU驅動SCL = 1, 此時器件會返回ACK應答 SDA_IN(); delay_us(1);while( I2C_SDA ) //CPU讀取SDA口線狀態 {con++;if(con>255){i2c_stop();return 1; //無應答信號 }}I2C_SCL_LOW; delay_us(1);return 0; //有應答 }/******************************************************************************* * 函 數 名 : i2c_ack * 函數功能 : iic應答信號 * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void i2c_ack(void) {SDA_OUT();I2C_SDA_LOW;delay_us(1);I2C_SCL_UP; //CPU產生1個時鐘delay_us(4); //時鐘低電平周期大于4μI2C_SCL_LOW; //清時鐘線,鉗住I2C總線以便繼續接收delay_us(4);I2C_SDA_UP; //CPU釋放SDA總線 }/******************************************************************************* * 函 數 名 : I2C_No_ack * 函數功能 : iic非應答信號 * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void I2C_No_ack(void) {SDA_OUT();I2C_SDA_UP;delay_us(1);I2C_SCL_UP;delay_us(4);I2C_SCL_LOW; delay_us(4); }/******************************************************************************* * 函 數 名 : SDA_OUT * 函數功能 : SDA 設置為輸出 * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void SDA_OUT(void) { /* 標準庫使用,修改端口引腳可用GPIO_InitTypeDef GPIO_InitTypeStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitTypeStruct.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitTypeStruct.GPIO_Pin=GPIO_Pin_7; GPIO_InitTypeStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitTypeStruct); */ /* HAL庫使用,HAL庫注意要把初始化函數的靜態標記去掉 */GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.Pin = SDA_Pin; //使用STM3cubemx是定義好的SDA_Pin為GPIO_PIN_8的標簽GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); }/******************************************************************************* * 函 數 名 : SDA_IN * 函數功能 : SDA 設置為輸入 * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void SDA_IN(void) {/* 標準庫使用,修改端口引腳可用GPIO_InitTypeDef GPIO_InitTypeStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitTypeStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_InitTypeStruct.GPIO_Pin=GPIO_Pin_7; GPIO_InitTypeStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitTypeStruct); */ /* HAL庫使用, HAL庫注意要把初始化函數的靜態標記去掉 */GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.Pin = SDA_Pin ; //使用STM3cubemx是定義好的SDA_Pin為GPIO_PIN_8的標簽GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); } /******************************************************************************* * 函 數 名 : delay_us * 函數功能 : 延時函數,延時us * 輸 入 : i * 輸 出 : 無 *******************************************************************************/ void delay_us(uint32_t i) {uint32_t temp;SysTick->LOAD=9*i; //設置重裝數值, 72MHZ時SysTick->CTRL=0X01; //使能,減到零是無動作,采用外部時鐘源SysTick->VAL=0; //清零計數器do{temp=SysTick->CTRL; //讀取當前倒計數值 }while((temp&0x01)&&(!(temp&(1<<16)))); //等待時間到達 SysTick->CTRL=0; //關閉計數器SysTick->VAL=0; //清空計數器 }

?

該代碼,標準庫可用,HAL庫也可用,只需要代碼做一些修改即可!

轉載于:https://www.cnblogs.com/xingboy/p/9585350.html

總結

以上是生活随笔為你收集整理的STM32 软件模拟 IIC 代码,标准库、HAL库可用的全部內容,希望文章能夠幫你解決所遇到的問題。

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