1034|3

194

帖子

4

TA的资源

纯净的硅(初级)

楼主
 

【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);
}

代码文件在这里,欢迎各位大佬指正,谢谢

Projects_Templates - Screen.zip (236.85 KB, 下载次数: 0)

最新回复

找几个例程看看先   详情 回复 发表于 2024-1-29 16:41
点赞 关注
 
 

回复
举报

6807

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

 IIC 发送Tx buffer 数组的时候,除了方法调用的时候传递这个Slaver address ,还需要在Tx buffer里加上,,,,

这个是个问题到底是该怎么整呢

 

点评

不是问题,是我不知道怎么用。 还需要再研究下  详情 回复 发表于 2024-1-29 14:43
 
 
 

回复

194

帖子

4

TA的资源

纯净的硅(初级)

板凳
 
Jacktang 发表于 2024-1-29 07:35  IIC 发送Tx buffer 数组的时候,除了方法调用的时候传递这个Slaver address ,还需要在Tx buffer里加 ...

不是问题,是我不知道怎么用。 还需要再研究下

点评

找几个例程看看先  详情 回复 发表于 2024-1-29 16:41
 
 
 

回复

7608

帖子

2

TA的资源

五彩晶圆(高级)

4
 
御坂10032号 发表于 2024-1-29 14:43 不是问题,是我不知道怎么用。 还需要再研究下

找几个例程看看先

个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表