查看: 712|回复: 1

【瑞萨RA4系列开发板体验】硬件iic点亮oled屏幕

[复制链接]

116

主题

133

帖子

3768

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3768
发表于 2023-1-5 15:02:43 | 显示全部楼层 |阅读模式
作者:少年阿炳


写在前面
此次点亮oled主要是参考了本次开发自带的资料和其他网络资料。
本工程存在bug,直接烧录无法运行,需要在调试模式,全速运行,程序会自动停止,然后再点全速运行才能点亮。
程序会在下图,38行停止。不知道怎么解决,请路过的朋友帮忙看看,工程压缩包会放在最下方。




本次实验现象
1.屏幕显示“瑞萨 电子发烧友”
2.led1灯闪烁



建立工程
本次工程实在之前LED灯闪烁的基础上建立,下面只分享如何配置IIC并移植屏幕驱动。
1.打开RASC 选择->Stacks->New stack->Connectivity->I2C_Master(r_iic_master)


2.点击g_i2c_master0

3.iic参数配置

点击SDA栏,右侧会出现一个箭头,点击箭头配置IIC引脚


IIC配置完毕。生成工程即可。

移植OLED驱动
本次移植的驱动来源于stm32,是模拟IIC。
1.将oled相应的所有文件导入到工程,并添加路径。
2.删除在stm32时用到的#include 文件,比如#include“sys.h”
3.删除io口初始化部分,删除模拟IIC部分,比如IIC_Start()这类函数。
4.重新定义IIC写入命令和写入数据的函数

  1. //变量定义
  2. extern fsp_err_t err;
  3. int  timeout_ms;
  4. extern  i2c_master_event_t i2c_event ;

  5. static void OLED_WR_Byte(unsigned char dat,unsigned char cmd)
  6. {
  7.     if(cmd)
  8.     {
  9.         Write_IIC_Data(dat);
  10.     }
  11.     else
  12.     {
  13.         Write_IIC_Command(dat);
  14.     }
  15. }

  16. /**********************************************
  17. // IIC Write Command
  18. **********************************************/
  19. void Write_IIC_Command(unsigned char IIC_Command)
  20. {
  21.     uint8_t ii[2]={0x00,0x00};            
  22.     ii[1]=IIC_Command;            
  23.     err = R_IIC_MASTER_Write(&g_i2c_master0_ctrl, ii, 0x02, true);
  24.     assert(FSP_SUCCESS == err);            
  25.     /* Since there is nothing else to do, block until Callback triggers*/
  26.     while ((I2C_MASTER_EVENT_TX_COMPLETE != i2c_event) && timeout_ms>0)
  27.     {                    
  28.         R_BSP_SoftwareDelay(1U, BSP_DELAY_UNITS_MICROSECONDS);
  29.         timeout_ms--;            
  30.     }            
  31.     if (I2C_MASTER_EVENT_ABORTED == i2c_event)            
  32.     {                    
  33.         __BKPT(0);            
  34.     }            
  35.     /* Read data back from the I2C slave */            
  36.     i2c_event = I2C_MASTER_EVENT_ABORTED;            
  37.     timeout_ms           = 1000;   
  38. }

  39. /**********************************************
  40. // IIC Write Data
  41. **********************************************/
  42. void Write_IIC_Data(unsigned char IIC_Data)
  43. {
  44.     uint8_t ii[2]={0x40,0x00};
  45.     ii[0] = 0x40;
  46.     ii[1]=IIC_Data;
  47.     err = R_IIC_MASTER_Write(&g_i2c_master0_ctrl, ii, 0x02, true);

  48.     assert(FSP_SUCCESS == err);            
  49.     /* Since there is nothing else to do, block until Callback triggers*/            
  50.     while ((I2C_MASTER_EVENT_TX_COMPLETE != i2c_event) && timeout_ms>0)            
  51.     {                    
  52.         R_BSP_SoftwareDelay(1U, BSP_DELAY_UNITS_MICROSECONDS);                    
  53.         timeout_ms--;
  54.     }
  55.    if (I2C_MASTER_EVENT_ABORTED == i2c_event)
  56.    {
  57.        __BKPT(0);
  58.    }
  59.    /* Read data back from the I2C slave */
  60.    i2c_event = I2C_MASTER_EVENT_ABORTED;
  61.    timeout_ms           = 1000;
  62. }
复制代码
OLED初始化函数
  1. //初始化SSD1306
  2. void OLED_Init(void)
  3. {
  4.     OLED_WR_Byte(0xAE,OLED_CMD);//--display off
  5.     OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
  6.     OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
  7.     OLED_WR_Byte(0x40,OLED_CMD);//--set start line address
  8.     OLED_WR_Byte(0xB0,OLED_CMD);//--set page address
  9.     OLED_WR_Byte(0x81,OLED_CMD); // contract control
  10.     OLED_WR_Byte(0xFF,OLED_CMD);//--128
  11.     OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap
  12.     OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverse
  13.     OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
  14.     OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 duty
  15.     OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction
  16.     OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset
  17.     OLED_WR_Byte(0x00,OLED_CMD);//

  18.     OLED_WR_Byte(0xD5,OLED_CMD);//set osc division
  19.     OLED_WR_Byte(0x80,OLED_CMD);//

  20.     OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off
  21.     OLED_WR_Byte(0x05,OLED_CMD);//

  22.     OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period
  23.     OLED_WR_Byte(0xF1,OLED_CMD);//

  24.     OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion
  25.     OLED_WR_Byte(0x12,OLED_CMD);//

  26.     OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh
  27.     OLED_WR_Byte(0x30,OLED_CMD);//

  28.     OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable
  29.     OLED_WR_Byte(0x14,OLED_CMD);//

  30.     OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
  31. }
复制代码
以上便完成了OLED驱动部分的移植。之后就是hal_entry的函数。
  1. void hal_entry(void)
  2. {


  3. err = R_IIC_MASTER_Open(&g_i2c_master0_ctrl, &g_i2c_master0_cfg);
  4. assert(FSP_SUCCESS == err);
  5. R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS); // NOLINT
  6. OLED_Init();//OLED初始化
  7. OLED_Clear();//清屏

  8. //OLED_ShowString(16,1,"RA",16);
  9. OLED_ShowCHinese(32,1,0);//瑞
  10. OLED_ShowCHinese(48,1,1);//萨
  11. OLED_ShowCHinese(0,4,2);//电
  12. OLED_ShowCHinese(16,4,3);//子
  13. OLED_ShowCHinese(32,4,4);//发
  14. OLED_ShowCHinese(48,4,5);//烧
  15. OLED_ShowCHinese(60,4,6);//友

  16. /* TODO: add your own code here */
  17. while(1)
  18. {
  19. R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS); // NOLINT
  20. R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_15, BSP_IO_LEVEL_LOW);
  21. R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS); // NOLINT
  22. R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_15, BSP_IO_LEVEL_HIGH);

  23. }


  24. #if BSP_TZ_SECURE_BUILD
  25. /* Enter non-secure code */
  26. R_BSP_NonSecureEnter();
  27. #endif
  28. }
复制代码
变量定义
  1. fsp_err_t err;
  2. i2c_master_event_t i2c_event = I2C_MASTER_EVENT_ABORTED;
复制代码
IIC的回调函数
  1. void IIC_Master_callback(i2c_master_callback_args_t *p_args)
  2. {
  3.     i2c_event = I2C_MASTER_EVENT_ABORTED;
  4.     if (NULL != p_args)
  5.     {
  6.         /* capture callback event for validating the i2c transfer event*/
  7.         i2c_event = p_args->event;
  8.     }
  9. }
复制代码
之后便可编译过程,在调试模式按照此贴开头的方式运行。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

3

主题

195

帖子

1266

积分

金牌会员

Rank: 6Rank: 6

积分
1266
发表于 2023-3-14 11:24:51 | 显示全部楼层

不错,学习一下
回复

使用道具 举报

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

本版积分规则

用户排行榜

RA助手

主题: 116帖子:133精华:0

RA_Lance

主题: 92帖子:132精华:9

lugl

主题: 38帖子:126精华:0

xujiwei263

主题: 16帖子:73精华:0

books咦

主题: 11帖子:11精华:2

Juggernaut

主题: 9帖子:95精华:0
快速回复 返回顶部 返回列表