【ACM32G103RCT6】 + 软件IIC 点亮OLED 0.9寸 IIC4线IIC屏幕
[复制链接]
背景
Hello 大家好,今天给大家带来一个使用ACM32G103RCT6软件IIC点亮OLED0.9寸屏幕的驱动库。
之前没有使用过IIC的硬件HAL库,研究了两三天晚上没有研究明白。
/* Function : HAL_I2C_Master_Transmit */
HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
我不明白的地方时这个 IIC 发送Tx buffer 数组的时候,除了方法调用的时候传递这个Slaver address ,还需要在Tx buffer里加上吗?
还有一点就是,该怎么收到或者发送ACK。 昨天接了一个IIC的GY-302模块发送地址0x46一直收到这个方法返回的HAL_ERROR.
于是便转换了思路使用了软件的IIC移植了来自STM32的OLED驱动函数(原代码来源:江协科技)来点亮了OLED0.9寸屏幕完成IIC的基本使用。后续的硬件IIC等我弄明白后,会在这个Demo上额外补充。
软件IIC点亮OLED0.9寸效果示意
软件IIC代码
- OLED.h (函数头文件)
- OLED.c (源文件,代码实现)
- OLED_Font.h (字库文件)
具体的使用方法
在main.c 中include OLED.h 头文件,然后调用其中的OLED_Init() 方法即可完成屏幕的初始化
#include "main.h"
#include "OLED.h"
int main(void)
{
HAL_Init();
SystemClock_Config();
BSP_UART_Init();
OLED_Init();
OLED_ShowString(1,1,"ACM32G103RCT6");
OLED_ShowString(2,1,"ShangHai");
OLED_ShowString(3,1,"HangXin");
while(1)
{
};
}
可以通过调用不同的方法来实现不同的效果:
void OLED_Init(void);
void OLED_Clear(void);
void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char);
void OLED_ShowString(uint8_t Line, uint8_t Column, char *String);
void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);
void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length);
void OLED_ShowHexNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);
void OLED_ShowBinNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);
其中OLED_I2C_Init()完成了软件SCL和SDA的初始化, 你可以在这里定义或者修改成你的端口。注意,如果你不是使用的GPIOB,你需要自己打开其他GPIO的时钟
/*引脚初始化*/
void OLED_I2C_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
// 开启GPIOF时钟
__HAL_RCC_GPIOB_CLK_ENABLE();
//初始化IO PIN
GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
//设置驱动能力,驱动的电流大小,我这里没有高精密的仪器,无法测量
GPIO_InitStruct.Drive = GPIO_DRIVE_LEVEL3;
//没有找到详细的功能定义 GPIOEx_function_selection
GPIO_InitStruct.Alternate = GPIO_FUNCTION_0;
//使用HAL初始化GPIO
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
//SCL
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7,GPIO_PIN_SET);
//SDA
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6,GPIO_PIN_SET);
}
代码文件在这里,欢迎各位大佬指正,谢谢
|