首页 > 其他分享 >STM32的HAL库软件模拟IIC

STM32的HAL库软件模拟IIC

时间:2023-05-13 18:14:38浏览次数:37  
标签:delay HAL void STM32 high IIC GPIO i2c analog

softiic.h

 1 #ifndef __SOFTI2C_H_
 2 #define __SOFTI2C_H_
 3 
 4 #include "main.h"
 5 //使用IICX   PD6,PC1
 6 
 7 #define SDA_IN()  {GPIOC->MODER &= ~(3 << 1 * 2);GPIOC->MODER = (0 << 1 * 2);}
 8 #define SDA_OUT() {GPIOC->MODER &= ~(3 << 1 * 2);GPIOC->MODER = (1 << 1 * 2);}
 9 
10 //IO操作函数     
11 #define i2c_scl_low()    HAL_GPIO_WritePin(GPIOD, GPIO_PIN_6, GPIO_PIN_RESET)
12 #define i2c_scl_high()   HAL_GPIO_WritePin(GPIOD, GPIO_PIN_6, GPIO_PIN_SET)
13 
14 #define i2c_sda_low()    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_RESET)
15 #define i2c_sda_high()   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_SET)
16 
17 #define i2c_read_sda()   HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_1)
18 
19 extern uint32_t delay1us;
20 
21 void delay_1us(uint32_t delay_1us);
22 
23 void analog_i2c_delay(void);
24 
25 void bsp_analog_i2c_init(void);
26 
27 void bsp_analog_i2c_start(void);
28 
29 void bsp_analog_i2c_stop(void);
30 
31 uint8_t bsp_analog_i2c_wait_ack(void);
32 
33 void bsp_analog_i2c_ack(void);
34 
35 void bsp_analog_i2c_nack(void);
36 
37 void bsp_analog_i2c_send_byte(uint8_t data);
38 
39 uint8_t bsp_analog_i2c_read_byte(void);
40 
41 #endif

soft.c

  1 #include "softi2c.h"
  2 
  3 uint32_t delay1us;
  4 
  5 /** 
  6  * @brief: 1us延时
  7  * @param {uint32_t} delay_1us
  8  * @return {*}
  9  */
 10 void delay_1us(uint32_t delay_1us)
 11 {
 12     HAL_TIM_Base_Start_IT(&htim3);
 13     delay1us = delay_1us;
 14     while (delay1us);
 15     HAL_TIM_Base_Stop_IT(&htim3);
 16 }
 17 
 18 /** 
 19  * @brief: IIC延时时间
 20  * @return {*}
 21  */
 22 void analog_i2c_delay(void)
 23 {
 24     delay_1us(2);
 25 }
 26 
 27 /** 
 28  * @brief: 软件模拟I2C初始化
 29  * @return {*}
 30  */
 31 void bsp_analog_i2c_init(void)
 32 {
 33     GPIO_InitTypeDef GPIO_InitStruct = {0};
 34 
 35     __HAL_RCC_GPIOD_CLK_ENABLE();
 36     __HAL_RCC_GPIOC_CLK_ENABLE();
 37 
 38     /*Configure GPIO pins : PD6 */
 39     GPIO_InitStruct.Pin = GPIO_PIN_6;
 40     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 41     GPIO_InitStruct.Pull = GPIO_NOPULL;
 42     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
 43     HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
 44     
 45     /*Configure GPIO pins : PC1 */
 46     GPIO_InitStruct.Pin = GPIO_PIN_1;
 47     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 48     GPIO_InitStruct.Pull = GPIO_NOPULL;
 49     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
 50     HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
 51 
 52     bsp_analog_i2c_stop();
 53 }
 54 
 55 /** 
 56  * @brief: I2C 开始,SCL为高电平的时候SDA产生一个下降沿信号
 57  * @return {*}
 58  */
 59 void bsp_analog_i2c_start(void)
 60 {
 61     /*    _____
 62      *SDA      \_____________
 63      *    __________
 64      *SCL           \________
 65      */
 66     i2c_sda_high();
 67     i2c_scl_high();
 68     analog_i2c_delay();
 69     i2c_sda_low();
 70     analog_i2c_delay();
 71     i2c_scl_low();
 72     analog_i2c_delay();
 73 }
 74 
 75 /** 
 76  * @brief: I2C 停止,SCL为高电平的时候SDA产生一个上升沿信号
 77  * @return {*}
 78  */
 79 void bsp_analog_i2c_stop(void)
 80 {
 81     /*               _______
 82      *SDA __________/
 83      *          ____________
 84      *SCL _____/
 85      */
 86     i2c_sda_low();
 87     i2c_scl_high();
 88     analog_i2c_delay();
 89     i2c_sda_high();
 90     analog_i2c_delay();
 91 }
 92 
 93 /** 
 94  * @brief: I2C 等待响应
 95  * @return {*}
 96  */
 97 uint8_t bsp_analog_i2c_wait_ack(void)
 98 {
 99     uint32_t timeout = 0;
100 
101     i2c_sda_high();
102     SDA_IN();
103     analog_i2c_delay();
104     i2c_scl_high();
105     analog_i2c_delay();
106     while(i2c_read_sda())
107     {
108         timeout++;
109         if(timeout > 2000)
110         {
111             return 1;
112         }
113     }
114     i2c_scl_low();
115     analog_i2c_delay();
116     return 0;
117 }
118 
119 /** 
120  * @brief: I2C 响应
121  * @return {*}
122  */
123 void bsp_analog_i2c_ack(void)
124 {
125     /*           ____
126      *SCL ______/    \______
127      *    ____         _____
128      *SDA     \_______/
129      */
130     i2c_sda_low();
131     analog_i2c_delay();
132     i2c_scl_high();
133     analog_i2c_delay();
134     i2c_scl_low();
135     analog_i2c_delay();
136     i2c_sda_high();
137 }
138 
139 /** 
140  * @brief: I2C 不响应
141  * @return {*}
142  */
143 void bsp_analog_i2c_nack(void)
144 {
145     /*           ____
146      *SCL ______/    \______
147      *    __________________
148      *SDA
149      */
150     i2c_sda_high();
151     analog_i2c_delay();
152     i2c_scl_high();
153     analog_i2c_delay();
154     i2c_scl_low();
155     analog_i2c_delay();
156 }
157 
158 /** 
159  * @brief: I2C 发送一个字节数据
160  * @param {uint8_t} data
161  * @return {*}
162  */
163 void bsp_analog_i2c_send_byte(uint8_t data)
164 {
165     uint8_t i;
166 
167     SDA_OUT();
168     for(i = 0; i < 8; i++)
169     {
170         if(data & 0x80)
171         {
172            i2c_sda_high();
173         }
174         else
175         {
176             i2c_sda_low();
177         }
178 
179         analog_i2c_delay();
180         i2c_scl_high();
181         analog_i2c_delay();
182         i2c_scl_low();
183         if(i == 7)
184         {
185             i2c_sda_high();
186         }
187         data <<= 1;
188         analog_i2c_delay();
189     }
190 }
191 
192 /** 
193  * @brief: I2C 读一个字节数据
194  * @return {*}
195  */
196 uint8_t bsp_analog_i2c_read_byte(void)
197 {
198     uint8_t i, data = 0;
199 
200     i2c_sda_high();
201     SDA_IN();
202     for(i = 0; i < 8; i++ )
203     {
204         data <<= 1;
205         i2c_scl_high();
206         analog_i2c_delay();
207         if(i2c_read_sda())
208         {
209             data++;
210         }
211         i2c_scl_low();
212         analog_i2c_delay();
213     }
214 
215     return data;
216 }

部分改写,原处:https://blog.csdn.net/weixin_43808708/article/details/126961103

标签:delay,HAL,void,STM32,high,IIC,GPIO,i2c,analog
From: https://www.cnblogs.com/wdndmfirst/p/17397806.html

相关文章

  • FPGA读写IIC驱动源码,源码包含iic驱动,testbench以及eeprom模型。
    FPGA读写IIC驱动源码,源码包含iic驱动,testbench以及eeprom模型。该代码已经下板验证通过。ID:17100653395566310......
  • 野火RA6M5开发板 IIC-OLED测试学习
    野火RA6M5开发板IIC-OLED测试学习野火RA6M5开发板野火RA6M5开发板上的外部高速晶振为24M.【瑞萨RA4系列开发板体验】通过Uart串口烧写程序https://bbs.elecfans.com/jishu_2322246_1_1.htmlIIC配置参考文章瑞萨e2studio-IIC-12864OLED移植https://blog.csdn.net/qq_2......
  • STM32_9(USART串口)
    串口通信串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大地扩展了单片机的应用范围,增强了单片机系统的硬件实力 硬件电路简单双向串......
  • Halcon联合C#开发实用版框架,在2.0版本基础上做了修改的,实际项目应用过的版本,源码,修改
    Halcon联合C#开发实用版框架,在2.0版本基础上做了修改的,实际项目应用过的版本,源码,修改了很多Bug,自带有项目运行流程与图片,很适合学习使用,可修改参考用于项目。注:软件能够正常编译运行,使用中遇到Bug自行摸索解决,主要是源码学习参考为主。ID:2619656657567557......
  • stm32 AES256加密 串口IAP升级 bootloader程序 通过上位机将keil生成的
    stm32AES256加密串口IAP升级bootloader程序通过上位机将keil生成的BIN文件进行AES加密,得到新的加密文件,加密需要自己设置秘钥,加密升级包直接烧录不能运行。通过串口升级上位机将加密包发送到单片机,单片机接收到数据后,会根据你事先设置好的秘钥,对数据进行还原,再写入。解密完成,程......
  • 霍尔自学习 stm32f4平台的有hall方波控制工程, 在这这个基础上增加了
    霍尔自学习stm32f4平台的有hall方波控制工程,在这这个基础上增加了hall自学习流程,增加了上位机通信协议,使得电机相线和hall线可以任意接,都可以一键学习,运行电机。keil工程,带结果校验,带上位机。以上描述的资料。提供源码、上位机、hall自学习方法、有感方波控制的所有问题,包括一些超......
  • STM32 BMS电池管理系统 主控STM32F103C8T6,具有以下功能:
    STM32BMS电池管理系统主控STM32F103C8T6,具有以下功能:1.具有单体电压、总体电压检测,过充、过放告警及保护功能。常温下静态电压采样精度可达小于20mV。2.具有充放电电流检测,充放电过流告警及保护功能。上位机可以显示充放电状态。3.具有均衡功能,均衡条件程序默认压差大于50mV......
  • STM32同步Buck降压开关电源变换器开方案 主控STM32F334
    STM32同步Buck降压开关电源变换器开方案主控STM32F334,输入12-32V,输出5-28V,最大电流5.5A,才有恒压限流模式,开关频率200kHz,PID控制与2零3极点控制。输出纹波<200mV,具有过压、过流、短路、输入欠压等保护功能。提供原理图,开发软件,设计文档,详细的计算书,使用说明书,PSIM仿真,bom,代码,代码有......
  • STM32_8(DMA)
    DMADMA(DirectMemoryAccess)直接存储器存取DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输,无须CPU干预,节省了CPU的资源12个独立可配置的通道:DMA1(7个通道),DMA2(5个通道)每个通道都支持软件触发和特定的硬件触发存储器和存储器之间的数据转运用软件触发,外设到存......
  • STM32锅炉控制器方案 主控stm32F103VET6,锅炉的控制器,有流
    STM32锅炉控制器方案主控stm32F103VET6,锅炉的控制器,有流程图和程序协议的介绍。项目涉及文件系统,sd卡驱动,多路AD采集,modbus通信,CRC校验,I2C,SPIflash等等。提供PCB及原理图(ad格式),源码,源码含大量的中文注释。说明文档。ID:8610676487741446......