打印

AT085 MCU SPI

[复制链接]
599|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zlcn|  楼主 | 2023-7-27 15:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用AT085 MCU驱动增加SPI外设,驱动OLED屏幕;SPI端口无硬件FIFO,写入命令及数据到OLED模块时,每次写入都需要等待SPI发送完成,并清除标志位;软件上等待SPI完成发送使用了while循环等待发送完成,当对OLED模块写入图片数据时,while循环等待的时间严重占用了MCU资源,甚至定时任务调度函数时间均受到影响,请问下有没有好的思路可以避免MCU资源消耗问题

使用特权

评论回复
沙发
lz34| | 2023-7-29 11:55 | 只看该作者
别死等啊,用查询就好了,或者么改dma

使用特权

评论回复
板凳
鸥芯电驱港港| | 2023-7-31 09:20 | 只看该作者
1、是的,可以在mian函数内部轮询读取SPI发送完成标志后,再发送下一字节。
2、使用DMA方式多字节硬件搬运发送数据,这样占用MCU资源少。

使用特权

评论回复
评论
zlcn 2023-8-3 19:55 回复TA
使用CAN通信功能时,推荐使用外部时钟参考;请问能不能使用外部时钟作为CAN参考时钟,内部PLL时钟还是使用内部晶振的方式 
地板
caigang13| | 2023-8-2 07:24 | 只看该作者
有没有DMA,用DMA能够大大减少CPU资源的消耗。

使用特权

评论回复
5
zlcn|  楼主 | 2023-8-2 08:20 | 只看该作者
lz34 发表于 2023-7-29 11:55
别死等啊,用查询就好了,或者么改dma

是的,有改用查询方式,但是改了之后OLED底层驱动可能受到影响,不能正常显示

使用特权

评论回复
6
zlcn|  楼主 | 2023-8-2 08:30 | 只看该作者
void OLED_Write_Cmd(u8 data)
{
          OLED_DC_Clr();
       
          SPI_SIZE  = 1;
          //SPI_SendData(SPI,data);       
       
         SPI_TX_DATA = data;
       
    while (!(SPI_IE & BIT2))
    {
    };         
               
    SPI_IE |= BIT2;      //清除SPI传输完成标志位       
}

void OLED_Write_Data(u8 data)
{
          OLED_DC_Set();
       
          SPI_SIZE  = 1;
          //SPI_SendData(SPI,data);       
       
          SPI_TX_DATA = data;
       
    while (!(SPI_IE & BIT2))
    {
                       
    };         
       
    SPI_IE |= BIT2;      //清除SPI传输完成标志位       
               
}


上面两个函数是OLED屏幕的两个SPI底层驱动函数,操作屏幕显示时,需要先写入Cmd命令指定显示位置,再写入数据,有尝试将SPI标志位改用查询方式清除,但是可能是影响到操作时序,底层驱动失效,OLED不显示;

改用DMA模式,也是只能每次写入单字节数据

使用特权

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

本版积分规则

21

主题

134

帖子

4

粉丝