軟體模擬I2C時輸入與輸出切換

2022-06-17 18:00:24 字數 2552 閱讀 4319

一 為達到類似c51的操作需要新增以下位帶操作:#include "stm32f10x_gpio.h"

#include "stm32f10x_conf.h"

/* io位址對映*/

#define gpioa_odr_addr    (gpioa_base+12) //0x4001080c

#define gpiob_odr_addr    (gpiob_base+12) //0x40010c0c

#define gpioc_odr_addr    (gpioc_base+12) //0x4001100c

#define gpiod_odr_addr    (gpiod_base+12) //0x4001140c

#define gpioe_odr_addr    (gpioe_base+12) //0x4001180c

#define gpiof_odr_addr    (gpiof_base+12) //0x40011a0c    

#define gpiog_odr_addr    (gpiog_base+12) //0x40011e0c    

#define gpioa_idr_addr    (gpioa_base+8) //0x40010808

#define gpiob_idr_addr    (gpiob_base+8) //0x40010c08

#define gpioc_idr_addr    (gpioc_base+8) //0x40011008

#define gpiod_idr_addr    (gpiod_base+8) //0x40011408

#define gpioe_idr_addr    (gpioe_base+8) //0x40011808

#define gpiof_idr_addr    (gpiof_base+8) //0x40011a08

#define gpiog_idr_addr    (gpiog_base+8) //0x40011e08

/* 輸入 */

#define pain(n)        *((volatile unsigned long *)(0x42000000+((gpioa_idr_addr-0x40000000)<<5)+(n<<2)))

#define pbin(n)        *((volatile unsigned long *)(0x42000000+((gpiob_idr_addr-0x40000000)<<5)+(n<<2)))

#define pcin(n)        *((volatile unsigned long *)(0x42000000+((gpioc_idr_addr-0x40000000)<<5)+(n<<2)))

#define pdin(n)        *((volatile unsigned long *)(0x42000000+((gpiod_idr_addr-0x40000000)<<5)+(n<<2)))

#define pein(n)        *((volatile unsigned long *)(0x42000000+((gpioe_idr_addr-0x40000000)<<5)+(n<<2)))

#define pfin(n)        *((volatile unsigned long *)(0x42000000+((gpiof_idr_addr-0x40000000)<<5)+(n<<2)))

/* 輸出 */

#define paout(n)    *((volatile unsigned long *)(0x42000000+((gpioa_odr_addr-0x40000000)<<5)+(n<<2)))

#define pbout(n)    *((volatile unsigned long *)(0x42000000+((gpiob_odr_addr-0x40000000)<<5)+(n<<2)))

#define pcout(n)    *((volatile unsigned long *)(0x42000000+((gpioc_odr_addr-0x40000000)<<5)+(n<<2)))

#define pdout(n)    *((volatile unsigned long *)(0x42000000+((gpiod_odr_addr-0x40000000)<<5)+(n<<2)))

#define peout(n)    *((volatile unsigned long *)(0x42000000+((gpioe_odr_addr-0x40000000)<<5)+(n<<2)))

二 假設sda=pb0,scl=pb1:

#define sda_in()  /*也就是對應的gpio輸入輸出配置暫存器進行操作:pb0的輸入上拉*/

#define sda_out() /*pb0的上拉,輸出速度50mhz*/

#define iic_scl    pbout(1) /*相當於操作函式gpio_writebit*/

#define iic_sda    pbout(0)         

#define read_sda   pbin(0)  /*相當於操作函式gpio_readinputdatabit*/

I2C 協議之軟體模擬時序

i2c 匯流排時 philips 公司推出的一種序列匯流排,具備多主機系統所需的包括匯流排仲裁和高低速器件同步功能的高效能序列匯流排。它只需要兩跟雙向的訊號線,一根資料線 sda,乙個是時鐘線 scl。在 i2c 匯流排上面,每個器件都有自己相應的 i2c 位址,所以在兩個器件之間進行通訊的時候,都...

STM32 軟體模擬I2C

i2c的兩個引腳 scl引腳和sda引腳 需要既能輸出又能輸入,為了避免複雜的配置操作需要把該引腳配置為開漏輸出模式,該模式的說明如下圖所示 當微控制器的sda引腳配置為低電平時,sda線被拉低 當微控制器的sda引腳配置為高電平時,引腳埠為高阻態,sda線通過上拉電阻被vcc拉高。因此一定要注意在...

模擬舵機除錯(I2C轉PWM輸出 )

平台 mt6737m 舵機 模擬舵機 知識儲備 舵機 介面 vcc,gnd,訊號 原理 乙個20ms左右的時基脈衝,該脈衝的高電平部分一般為0.5ms 2.5ms範圍內的角度控制脈衝。簡單講,就是乙個50hz的pwm波形,脈寬 高電平 範圍在0.5 2.5ms變化,控制角度的變化。我們平台用了10個...