打印
[资源分享]

【杰发科技AC7840x测评】I2C驱动OLED屏

[复制链接]
3072|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lulugl|  楼主 | 2023-11-28 14:41 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
#申请原创# #有奖活动#[url=home.php?mod=space&uid=760190]@21小跑堂 [/url]
【前言】
i2c为MCU常见的外设,可以用模拟或者硬件i2c来实现通信,i2c可以实现主从通信,可以实现一对多,或者多对一个的主从通信,只需要两根数据线就可以实现,在IO紧张的情况下可以实现少的IO来实现多个外设的通信。AC7840x拥有1个I2C0,最大通信时钟频率为400K。可以通过引脚复用,可以使用信号多路复用灵活实现引脚的分配。同时AC7804x的I2C还可以实现低功耗模式。而OLED屏也是最常见的外设,可以实现低能耗的显示解决方案。此实验验证i2c的写出数据的方法。
【配置】
官方的示例中给出主机模式的两种方案,主机中断发送与DMA发送。

在初始化时,先声明结构体,然后对PA2、PA3进行信号复用,复用为PORT_MUX_ALT3。
然后对配置结构体的7bit地址模式 ,声明从机地址,使用中断方式,同步禁能,仲裁禁能,波特率设置为400K,无回调函数,进行配置,代码如下:
<p>void II2CGpioInit(void)</p><p>{</p><p>/* I2C 配置结构体 */</p><p>    i2c_master_user_config_t i2c_master_config;</p><p>    /* 清I2C 配置结构体 */</p><p>    memset(&i2c_master_config, 0, sizeof(i2c_master_user_config_t));</p><p>    memset(&g_i2c_master_state, 0, sizeof(i2c_master_state_t));</p><p>    /* PA2->SDA,PA3->SCL */</p><p>    GPIO_DRV_SetMuxModeSel(PORTA, (gpio_channel_type_t)2U, PORT_MUX_ALT3);</p><p>    GPIO_DRV_SetMuxModeSel(PORTA, (gpio_channel_type_t)3U, PORT_MUX_ALT3);</p><p>    i2c_master_config.is10bitAddr    = false;                  /* 7bit地址模式 */</p><p>    i2c_master_config.slaveAddress   = OLED_ADDRESS;      /* i2c 从机地址 */</p><p>    i2c_master_config.transferType   = I2C_USING_INTERRUPTS;   /* i2c 使用中断方式 */</p><p>    i2c_master_config.syncEn         = false;                  /* i2c 同步禁能 */</p><p>    i2c_master_config.arbitration    = true;                   /* i2c 仲裁禁能 */</p><p>    i2c_master_config.baudRate       = 400000;                 /* i2c 波特率设置 */</p><p>    i2c_master_config.callback       = NULL;                   /* 无回调函数 */</p><p>    I2C_DRV_MasterInit(I2C0_INSTANCE,&i2c_master_config,&g_i2c_master_state);  /* i2c 调用底层函数后生效 */</p><p>}</p>

3、组装i2c发送指令与数据的两个函数,ssd1306发送指令与数据的不同就是数据第一位不同,分别为指令为0x00,数据为0x40。组装函数如下,我们使用I2C_DRV_MasterSendDataBlocking进行数据传输。
<p>void Write_IIC_Command(uint8_t IIC_Command) {</p><p>uint8_t buff[2] = {0};</p><p>buff[0] = 0x00;</p><p>buff[1] = IIC_Command;</p><p>I2C_DRV_MasterSendDataBlocking(I2C0_INSTANCE, buff, 2,  ENABLE, 100);</p><p>}</p><p>void Write_IIC_Data(uint8_t IIC_Data) {</p><p>uint8_t buff[2] = {0};</p><p>buff[0] = 0x40;</p><p>buff[1] = IIC_Data;</p><p>I2C_DRV_MasterSendDataBlocking(I2C0_INSTANCE, buff, 2, ENABLE, 100);</p><p>}</p>

4、由于AC7840x拥有大的内存,所以组装了一个发送整行128个数据的发送函数。由于在前面发个一个数据位的指令,所以要声明一个129的buffer,然后一次发送一个整行的数据,代码如下:
<p>uint8_t oled_transmit(uint8_t* pdata, uint16_t size)</p><p>{</p><p>  /* initialization parameters */</p><p>uint8_t buffer[129] = {0};</p><p>uint8_t i;</p><p>    /* 发送本次发送为数据的命令 */</p><p>buffer[0] = 0x40;</p><p>  for(i=1; i<size+1; i++)</p><p>{</p><p>buffer[i] = *pdata;</p><p>pdata ++;</p><p>}</p><p>I2C_DRV_MasterSendDataBlocking(I2C0_INSTANCE, buffer, size+1, \</p><p>                                        ENABLE, 100);</p><p>return 1;</p><p>}</p>

到此oled的移植代码就结束了,其余代码我附在工程源码,需要的自取。
主函数我这里添加测试函数
<p>int main(void)</p><p>{</p><p>    SystemClock_Config();     /* 系统时钟配置 */</p><p>    InitDebug();</p><p>    printf("I2C0 Master Test\n");</p><p>    SystemCoreClockUpdate();  /* 更新系统时钟频率 */</p><p>    OLED_Init();</p><p>    GUI_ShowString(10,0,"hello Wrold",16,1);</p><p>  GUI_ShowString(10,16,"AC7840x",16,0);</p><p>OLED_Display();</p><p>    while(1)</p><p>    {</p><p>    }</p><p>}</p>

【实验效果】

【总结】
AC7840x拥用1路I2C外设,并且固件库封装了常用的i2c发送函数,用户只需要几步就可以实现i2c的数据通信,并实现OLED屏的驱动。
01_I2C_Master_oled.zip (112.6 KB)

使用特权

评论回复

相关帖子

沙发
tpgf| | 2023-12-15 14:47 | 只看该作者
iic驱动屏幕是不是有点浪费带宽了啊

使用特权

评论回复
板凳
paotangsan| | 2023-12-15 15:35 | 只看该作者
既然只是使用一个iic  为什么还需要引脚复用呢

使用特权

评论回复
地板
lulugl|  楼主 | 2023-12-15 15:49 | 只看该作者
tpgf 发表于 2023-12-15 14:47
iic驱动屏幕是不是有点浪费带宽了啊

只是展示一功能呀,其实OLED也可以干很多事情的。

使用特权

评论回复
5
lulugl|  楼主 | 2023-12-15 15:50 | 只看该作者
paotangsan 发表于 2023-12-15 15:35
既然只是使用一个iic  为什么还需要引脚复用呢

他们的是一个IO可以有多种用途的。

使用特权

评论回复
6
wakayi| | 2023-12-15 19:19 | 只看该作者
需要多iic进行限速吗 否则是不是会刷屏太频繁了

使用特权

评论回复
7
keaibukelian| | 2023-12-15 19:55 | 只看该作者
如果同时和多个屏幕进行通讯 会降低通讯的效率吗

使用特权

评论回复
8
heimaojingzhang| | 2023-12-15 20:33 | 只看该作者
既然使用的是iic接口 是不是意味着可以带好多个屏啊

使用特权

评论回复
9
guanjiaer| | 2023-12-15 21:11 | 只看该作者
iic驱动屏幕的话 对总线的带载能力的最低要求是什么

使用特权

评论回复
10
forgot| | 2023-12-19 08:26 | 只看该作者
用得是IO口模拟I2C时序做的吧,也可以用外设自带的I2C试试看。

使用特权

评论回复
11
lulugl|  楼主 | 2023-12-19 10:17 | 只看该作者
forgot 发表于 2023-12-19 08:26
用得是IO口模拟I2C时序做的吧,也可以用外设自带的I2C试试看。

用的硬件i2c只,没有用DMA。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

145

主题

713

帖子

9

粉丝