查看: 54|回复: 0

[评测分享] 【ELF 2学习板】09.I2C接口编程及测试(2)

[复制链接]
  • TA的每日心情
    奋斗
    16 小时前
  • 签到天数: 207 天

    连续签到: 12 天

    [LV.7]常住居民III

    发表于 昨天 23:31 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 stm1024 于 2025-1-21 00:04 编辑

    本次为针对I2C的外设测试,找到了以前的一个0.96寸的OLED显示屏,今日尝试使用I2C点亮该显示屏。

    首先我们还是查看一下硬件手册,看看引出了哪些针脚可以支持我们的使用I2C:
    1.jpg

    可以看到3号和5号针脚,可以使用,但是对于前面的描述有点懵,到底是I2C-2还是I2C-4不太清楚,不过这个不要紧,一会就可以测试了:
    接好前后,查看I2C-4,对比发现:
    接线前后.jpg

    可以看到I2C-4上检测出来了一个地址为0x3c的设备,这个设备其实就是SSD1306的I2C 7位地址,因此选择I2C-4就没错了。

    然后是编写代码,关于SSD1306的驱动,其实在很多MCU的控制器学习中应该都接触到过,只需要把写I2C数据的函数稍微修改一下就可以了。最后整出了4组文件:
    1)i2c_ch4.c/i2c_ch4.h,这个是最基本的I2C-4通道的初始化,读,写I2C数据的函数。
    1. #ifndef __I2C4_H_
    2. #define __I2C4_H_
    3. #include <stdio.h>
    4. #include <linux/types.h>
    5. #include <fcntl.h>
    6. #include <unistd.h>
    7. #include <stdlib.h>
    8. #include <sys/types.h>
    9. #include <sys/ioctl.h>
    10. #include <errno.h>
    11. #include <assert.h>
    12. #include <string.h>
    13. #include <linux/i2c.h>
    14. #include <linux/i2c-dev.h>

    15. #define I2C_DEV_NAME "/dev/i2c-4"
    16. void i2c_init();
    17. int func_write_regs(unsigned char devaddr, unsigned char reg, unsigned char *buf);
    18. int func_read_regs(unsigned char devaddr, unsigned char reg, unsigned char *read_data);
    19. #endif
    复制代码

    2)SSD1306.c/SSD1306.h,这组数据是SSD1306的驱动代码,包含了设备如何初始化,以及向其中写入字符等函数;

    1. #ifndef __SSD1306_H_
    2. #define __SSD1306_H_

    3. #include "i2c_ch4.h"
    4. #include <stdint.h>

    5. #define SSD1306_IIC_7BIT_ADDR        0x3c

    6. void SSD1306_WRCmd(uint8_t cmd);

    7. void SSD1306_WRDat(uint8_t dat);

    8. void SSD1306_Init();

    9. void SSD1306_SetPos(uint8_t x,uint8_t y);

    10. void SSD1306_Fill(uint8_t gs);

    11. void SSD1306_Clear();

    12. //on/off
    13. void SSD1306_IO(uint8_t io);

    14. void SSD1306_ShowStr(uint8_t x,uint8_t y,char* str,uint8_t size);

    15. void SSD1306_ShowCN(uint8_t x,uint8_t y,uint8_t index);

    16. void SSD1306_ShowImg(uint8_t x1,uint8_t y1,uint8_t x2,uint8_t y2,uint8_t* img);

    17. #endif
    复制代码

    3)FontTab.h,这个是表示字符的头文件,事实上可以将每个字符理解为一个点阵,这个文件就是描述字符点阵的文件;

    4)app_entry.c,这个是主程序,包含main函数,是整个C语言的入口程序。
    1. #include "SSD1306.h"

    2. int main(int argc, char** argv)
    3. {
    4.         SSD1306_Init();
    5.         SSD1306_ShowStr(0,0,"ELF2-RK3588",2);
    6.         SSD1306_ShowStr(0,2,"stm1024",2);
    7. }
    复制代码

    使用 gcc -c xxx.c -o xxx.o的方式,将i2c_ch4.c, SSD1306.c以及app_entry.c编译为.o文件,最后一起生成为可执行文件app,文件目录如下:
    55.jpg


    Makefile代码如下:
    1. all:i2c_ch4.o SSD1306.o app.o output
    2. i2c_ch4.o:i2c_ch4.c
    3.         gcc -c i2c_ch4.c -o i2c_ch4.o
    4.         
    5. SSD1306.o:SSD1306.c
    6.         gcc -c SSD1306.c -o SSD1306.o
    7.         
    8. app.o:app_entry.c
    9.         gcc -c app_entry.c -o app.o
    10.         
    11. output:i2c_ch4.o SSD1306.o app.o
    12.         gcc -o app i2c_ch4.o SSD1306.o app.o
    13.         
    14. clean:
    15.         rm -f *.o app
    复制代码

    先make然后运行app程序,执行效果如下:
    99.jpg


    98.jpg

    可以看到,程序与预期的设想是一样的。
    OK,今日分享就先到这里了,不知不觉,从拿到板子到现在已经分享了10篇测评了,总的来说感觉还是不错的,很多驱动等都预装好了,省去构建和加载的一堆操作。


    回复

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    手机版|小黑屋|与非网

    GMT+8, 2025-1-21 16:44 , Processed in 0.116306 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.