新手上路
- 积分
- 39
- 金钱
- 39
- 注册时间
- 2019-11-14
- 在线时间
- 9 小时
|
10金钱
本帖最后由 xjn666 于 2022-3-27 14:46 编辑
楼主是想用模拟IIC来驱动oled,由于觉得使用HAL库写引脚太慢,所以想通过直接写寄存器的方式去控制引脚。我的硬件配置是B8控制SCL,B9控制SDA。
最奇怪的地方就是:
(1)如果我的宏定义写的是以下,那么是可以控制oled的
- #define OLED_SCLK_Clr my_sclk_clr()
复制代码 其中这几个函数的定义是
- void my_sclk_clr(void) { GPIOB->BSRR = (uint32_t)GPIO_PIN_8 << 16u;}
- void my_sclk_set(void) { GPIOB->BSRR = GPIO_PIN_8;}
- void my_sdin_clr(void) { GPIOB->BSRR = (uint32_t)GPIO_PIN_9 << 16u;}
- void my_sdin_set(void) { GPIOB->BSRR = GPIO_PIN_9;}
复制代码 (2)而如果直接把修改寄存器放在宏定义中(如下),那么则无法控制oled
- #define OLED_SCLK_Clr { GPIOB->BSRR = (uint32_t)GPIO_PIN_8 << 16u;}
- #define OLED_SCLK_Set { GPIOB->BSRR = GPIO_PIN_8;}
- #define OLED_SDIN_Clr { GPIOB->BSRR = (uint32_t)GPIO_PIN_9 << 16u;}
- #define OLED_SDIN_Set { GPIOB->BSRR = GPIO_PIN_9;}
复制代码
附上我的模拟IIC代码,供大家查阅:
- //起始信号
- void oled096_I2C_Start(void)
- {
- OLED_SDIN_Set;
- OLED_SCLK_Set;
- OLED_SDIN_Clr;
- OLED_SCLK_Clr;
- }
- //结束信号
- void oled096_I2C_Stop(void)
- {
- OLED_SCLK_Set;
- OLED_SDIN_Clr;
- OLED_SDIN_Set;
- }
- //等待信号响应
- void oled096_I2C_WaitAck(void) //测数据信号的电平
- {
- OLED_SCLK_Set;
- OLED_SCLK_Clr;
- }
复制代码
|
|