本帖最后由 stm1024 于 2025-1-21 00:04 编辑
本次为针对I2C的外设测试,找到了以前的一个0.96寸的OLED显示屏,今日尝试使用I2C点亮该显示屏。
首先我们还是查看一下硬件手册,看看引出了哪些针脚可以支持我们的使用I2C:
可以看到3号和5号针脚,可以使用,但是对于前面的描述有点懵,到底是I2C-2还是I2C-4不太清楚,不过这个不要紧,一会就可以测试了:
接好前后,查看I2C-4,对比发现:
可以看到I2C-4上检测出来了一个地址为0x3c的设备,这个设备其实就是SSD1306的I2C 7位地址,因此选择I2C-4就没错了。
然后是编写代码,关于SSD1306的驱动,其实在很多MCU的控制器学习中应该都接触到过,只需要把写I2C数据的函数稍微修改一下就可以了。最后整出了4组文件:
1)i2c_ch4.c/i2c_ch4.h,这个是最基本的I2C-4通道的初始化,读,写I2C数据的函数。
- #ifndef __I2C4_H_
- #define __I2C4_H_
- #include <stdio.h>
- #include <linux/types.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <sys/ioctl.h>
- #include <errno.h>
- #include <assert.h>
- #include <string.h>
- #include <linux/i2c.h>
- #include <linux/i2c-dev.h>
- #define I2C_DEV_NAME "/dev/i2c-4"
- void i2c_init();
- int func_write_regs(unsigned char devaddr, unsigned char reg, unsigned char *buf);
- int func_read_regs(unsigned char devaddr, unsigned char reg, unsigned char *read_data);
- #endif
复制代码
2)SSD1306.c/SSD1306.h,这组数据是SSD1306的驱动代码,包含了设备如何初始化,以及向其中写入字符等函数;
- #ifndef __SSD1306_H_
- #define __SSD1306_H_
- #include "i2c_ch4.h"
- #include <stdint.h>
- #define SSD1306_IIC_7BIT_ADDR 0x3c
- void SSD1306_WRCmd(uint8_t cmd);
- void SSD1306_WRDat(uint8_t dat);
- void SSD1306_Init();
- void SSD1306_SetPos(uint8_t x,uint8_t y);
- void SSD1306_Fill(uint8_t gs);
- void SSD1306_Clear();
- //on/off
- void SSD1306_IO(uint8_t io);
- void SSD1306_ShowStr(uint8_t x,uint8_t y,char* str,uint8_t size);
- void SSD1306_ShowCN(uint8_t x,uint8_t y,uint8_t index);
- void SSD1306_ShowImg(uint8_t x1,uint8_t y1,uint8_t x2,uint8_t y2,uint8_t* img);
- #endif
复制代码
3)FontTab.h,这个是表示字符的头文件,事实上可以将每个字符理解为一个点阵,这个文件就是描述字符点阵的文件;
4)app_entry.c,这个是主程序,包含main函数,是整个C语言的入口程序。
- #include "SSD1306.h"
- int main(int argc, char** argv)
- {
- SSD1306_Init();
- SSD1306_ShowStr(0,0,"ELF2-RK3588",2);
- SSD1306_ShowStr(0,2,"stm1024",2);
- }
复制代码
使用 gcc -c xxx.c -o xxx.o的方式,将i2c_ch4.c, SSD1306.c以及app_entry.c编译为.o文件,最后一起生成为可执行文件app,文件目录如下:
Makefile代码如下:
- all:i2c_ch4.o SSD1306.o app.o output
- i2c_ch4.o:i2c_ch4.c
- gcc -c i2c_ch4.c -o i2c_ch4.o
-
- SSD1306.o:SSD1306.c
- gcc -c SSD1306.c -o SSD1306.o
-
- app.o:app_entry.c
- gcc -c app_entry.c -o app.o
-
- output:i2c_ch4.o SSD1306.o app.o
- gcc -o app i2c_ch4.o SSD1306.o app.o
-
- clean:
- rm -f *.o app
复制代码
先make然后运行app程序,执行效果如下:
可以看到,程序与预期的设想是一样的。 OK,今日分享就先到这里了,不知不觉,从拿到板子到现在已经分享了10篇测评了,总的来说感觉还是不错的,很多驱动等都预装好了,省去构建和加载的一堆操作。
|