发 帖  
原厂入驻New
[技术]

维信诺oled屏驱动开发之一(spi初始化ip核开发及驱动开发)

2020-9-27 10:23:22  136
分享
使用的是维信诺的一款480*800点阵的彩色oled屏。开发的方式是在zynq平台上自己开发驱动ip核进行屏的点亮和驱动。首先屏的需要spi接口来进行屏的初始化操作。唯信诺推荐是使用16bit的SPI方式,方式配置如下图: spi配置.png
唯信诺将I M固定拉成4’b0011即16bit SPI上升沿采样。
SPI只采取输入控制,不使用SDO信号,因为唯信诺的软排线没有联线到Gds8102;
SPI的写时序参考   GDS8102芯片手册。采用3线16位的SPI 总线来对OLED屏进行配置。
spi发送时序图.png
先发高地址,再发低地址,最后发数据;
高地址前8Bit是0x20(W=0,D/CX=0,H/L=1),低地址前8bit是0x00(W=0,D/CX=0,H/L=0),数据前8bit是0x40(W=0,D/CX=1,H/L=0);
下图是uboot的spi初始化代码,跟应用的调用代码流程差不多。 uboot驱动spi.png

比如gds_spi_write(0x2900,0x00);2900是地址,然后2900先将高8bit地址发送,发送过程是这样先将高8bit右移然后前面拼接上0x20。发送了这16bit后,再发送低8bit地址,流程一样,只是前面发送高8bit拼接上0x0。最后就是发送8bit数据了,数据放在低位,高8bit拼接上0x40.

讲完了调用部分,接着分析下ip核中spi的发送部分。这部分使用verilog写成。
以下是lcd IP核中spi发送部分,cnt_spi这个16计数器是整个灵魂。当发送使能有效,片选spi_cs拉低,同时计数器开始计数,当计数到15时就再拉高片选信号。发送数据是在发送使能后加载,在片选后进行移位发送。
  1. assign send_flag = slv_reg3[31];//寄存器3的31bit是发送使能标志
  2. assign tx_data = slv_reg3[15:0];
  3. always @(negedge spi_clk)//for negedge trigger spi
  4.      begin      
  5.          IF(rst == 1'b1)
  6.          begin
  7.             send_flag_1dly  <= 1'b0;
  8.             send_flag_2dly  <= 1'b0;
  9.             send_flag_3dly  <= 1'b0;
  10.          end
  11.          else
  12.             begin
  13.             send_flag_1dly  <= send_flag;
  14.             send_flag_2dly  <= send_flag_1dly;
  15.             send_flag_3dly  <= send_flag_2dly;
  16.             end
  17.      end
  18.      assign flag_head = send_flag_2dly && (~ send_flag_3dly);
  19.      always @(negedge spi_clk)//for negedge trigger spi
  20.      begin      
  21.          if(rst == 1'b1)
  22.             cnt_spi <= 4'b0;
  23.          else if(cnt_spi == 4'd15)
  24.             cnt_spi <= 4'b0;
  25.          else if(spi_cs == 1'b0)
  26.             cnt_spi <= cnt_spi + 4'b1;
  27.          else;
  28.      end   
  29.      
  30.      always @(negedge spi_clk) //for negedge trigger spi
  31.      begin      
  32.          if(rst == 1'b1)
  33.             spi_cs  <= 1'b1;
  34.          else if(cnt_spi == 4'd15)
  35.             spi_cs  <= 1'b1;
  36.          else if(flag_head == 1'b1)
  37.             spi_cs  <= 1'b0;
  38.          else;  
  39.      end
  40.      
  41.    
  42.     // always @(posedge spi_clk)
  43.      always @(negedge spi_clk) //for negedge trigger spi
  44.      begin      
  45.          if(rst == 1'b1)
  46.             spi_data <= 16'b0;
  47.          else if(flag_head == 1'b1)
  48.             spi_data <= tx_data;
  49.          else if(spi_cs == 1'b0 )
  50.             spi_data <= {spi_data[14:0],1'b0};
  51.          else;  
  52.      end
复制代码
然后仿真图如下
spi仿真图片.png

0
2020-9-27 10:23:22   评论 分享淘帖

只有小组成员才能发言,加入小组>>

81个成员聚集在这个小组

加入小组

创建小组步骤

关闭

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

快速回复 返回顶部 返回列表