RENESAS RA0微控制器序列化 - 面向对象的I2C驱动器?

本文指出:1个序言OLED是一种非常常用的显示器。它可以由4线和3线SPI或2线IIC驱动。 Baiwen.com提供了一项SPI_OLED驾驶任务,该任务目前用于与IIC一起驾驶,并使用面向对象的编程实施。 2实施步骤收集1。配置IIC,打开RASC后,将RAU_MASTER_I2C添加到堆栈中,然后将通道设置为0b20,通道2,将SCL选择为P112和SDA到P110。 [注意]我最初将其设置在通道0或通道1上,但是与UART或外部晶体振荡器的IO发生冲突,因此我只能选择此通道,但仍然与TX和LED相矛盾。如果您自己设计,您仍然需要考虑IO冲突。 2。形成代码后,我将drv_oled.h/c和driv_spi.h复制到项目中。 Seethe Platercopy在夹板印刷中? 1。3。在原始的OLED项目中,SPI用于驾驶它。同时,原始RA5的记忆高于RA0,并且许多更改是RE受到的。首先添加回调函数,判断回调功能的接受状态,然后更新:请参阅剪贴板上的Plaincopy? 1。有效sau_i2c_master_callback(i2c_master_callback_args_t * p_args)2。{3。开关(p_args-事件)4。{5。 C ASE I2C_MASTER_EVENT_TX_COMPLETE:6。{7。 gi2c1txcplt = true; 8。休息; 9.}10。CASEI2C_MASTER_EVENT_RX_COMPLETE:11。{12。 gi2c1rxcplt = true; 13。休息; 14.} 15。默认值:16。{17。 gi2c1txcplt = gi2c1rxcplt =错误; 18。休息; 19.} 20.} 21.} 4。然后在等待时间更改等待功能。将数据链接发送到I2C总线后,我们需要使用此功能来确定是否发送了标志的末尾。请参阅夹板印刷中的Plaincopy? 1。静态void i2c1waittxcplt(void)2。{3。 uint16_t wtimeout = 10; 4。而(gi2c2txcplt wtimeout)5。{6。 hal_delay(1); 7。wtimeout-; 8.}9。GI2C2TXCPLT=错误; 10.} 5。在SSD1306中更改寄存器的写作。在此功能中,我们想保存一个buff以在I2C总线上写入数据。自从编写了E SSD1306寄存器,第一个字节为0x00,因此组装为[0x00,cmd]。请参阅夹板印刷上的Plaincopy? 1。静态void oleddrvwriterg(uint8_t ucdata)2。{3。 uint8_t buff [2] = {0x00,0x00}; 4。buff [1] = ucdata; 5。6。if(fsp_success!= err)7。{8。 printf(“%s%drn”,__function__,__line __); 9。 10.}11。I2C1WAITTXCPLT(); 12.} 6。将命令发送到SSD1306的命令:请参阅plaincopy to clipboardprint? 1。静态void oleddrvwritebuf(uint8_t* rbuf,uint16_t wsize)2。{3。 fsp_err_t err; 4.5。 // err = r_sau_i2c_write(g_sau_i2c_master_ctrl,0x40,1,错误); 6。// if(fsp_success!= err)7。// printf(“函数:%sTline:%drn”,__function__,__line __); 8。RBUF[0] = 0x40; 9。err = r_sau_i2c_write(g_sau_i2c_master_ctrl,rbuf,1024,true); 10。if(fsp_success!= err)11。printf(“函数:%stline:%drn”,__function__,__line __); 12.13。 i2c1waittxcplt(); 14.}注意】这已成为申请新内存的杂物,但是由于此MCU存储器是LimiteD,我已经制作了该应用程序,似乎没有成功。我先写了。实际上,buf中的0位是 - 透明,因此会有一些问题。稍后我将再次驾驶此驱动程序,并首先在此处实现基本功能。 7。写测试功能如下:请参阅剪贴板上的Plaincopy? 1。有效的LED_BLINK(动词)2。{3.4。 uartdevicesregister(); 5.6.7。 displayDevice *ptdispdev = oledgetDevice(); 8。if(ptdispdev == null)9。{10。 printf(“无法获得OLED显示器!rn”); 11。 12.} 13.14。 ptdispdev-热(ptdispdev); 15。UINT8_T *PBUF =(UINT8_T *)PTDISPDEV- FBBASE; 16。而(1)17。{18.19。 for(uint16_t i = 0; idwsize; i ++)20。{21。 pbuf [i] = 0x00; 22.} 23。 24。hal_delay(1); 25。for(uint16_t i = 0; idwsize; i ++)26。{27。 pbuf [i] = 0xff; 28.} 29。 30。hal_delay(1); 31.32。 } 3。它实现了清除屏幕 - 完整亮度的效果。 3针对物体的编程摘要,OLED P可以在使用少量的低级别代码更改的过程中实现Ackaging,即实现模块化函数。下一个我将完成字符和图片。