在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4627|回复: 4

[求助] 液晶屏SPI初始化代码相关

[复制链接]
发表于 2011-9-15 20:43:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x
本帖最后由 glorygr 于 2011-9-16 09:36 编辑

手机屏驱动不同于AV屏的驱动,每次开机时必须写一些初始化代码。我打算按照SPI时序写,CS低有效,SCL上升沿采集数据。SDA为输出的数据。
初始化模块思路如下:

initial_module包含spi_write_module和initial_control_module两个模块。SPI发送模块主要按照时序完成一次9位代码的发送。initial_control_module模块告诉SPI发送模块何时开始发送数据以及需要发送几次9位代码。全部发送完毕后initial_control_module块告知顶层模块初始化完毕,跳出初始化程序。
初版程序如下:初始化模块需要循环(顶层初始化控制Top_Start_Sig=1)先写9'b000010111,再写9'b000101101和9'b000101001两条代码,且后面两条代码间需100ms间隔。系统时钟为50MHZ,但是程序出错,不知哪个地方出错?如何做才能使程序正常运行?还请高手指点一二,小弟不胜感激~~

module initial_module(
CLK,
RSTn,
Start_Sig,
Done_Sig,
SPI_Out
    );
input CLK;
input RSTn;
input Start_Sig;
output Done_Sig;
output [2:0] SPI_Out;//[2] CS [1] SCL [0] SDA
wire SPI_Start_Sig;
wire [8:0]SPI_Data;
wire SPI_Done_Sig;
initial_control_module U1
( .CLK(CLK),
  .RSTn(RSTn),
  .Start_Sig(Start_Sig),
  .SPI_Done_Sig(SPI_Done_Sig),//input-from U2
  .SPI_Start_Sig(SPI_Start_Sig),//output-to U2
  .SPI_Data(SPI_Data),          //output-to U2
  .Done_Sig(Done_Sig)           //output-to top
);
spi_write_module U2
( .CLK(CLK),
  .RSTn(RSTn),
  .Start_Sig(SPI_Start_Sig),//input-from U1
  .SPI_Data(SPI_Data),      //input-from U1
  .Done_Sig(SPI_Done_Sig),  //output-to U1
  .SPI_Out(SPI_Out)         //output-to U1
);
endmodule

module initial_control_module(
    CLK,
         RSTn,
         Start_Sig,
         SPI_Done_Sig,
         SPI_Start_Sig,
         SPI_Data,
         Done_Sig
    );
         input CLK;
         input RSTn;
         input Start_Sig;
         input SPI_Done_Sig;
         output SPI_Start_Sig;
         output [8:0]SPI_Data;
         output Done_Sig;
         reg[3:0]i;
         
         reg[8:0] rData;
         reg isSPI_Start;
        reg [31:0] delaycn;//延时计数器
         reg isDone;
         always@(posedge CLK or negedge RSTn)begin
         if (!RSTn)
          begin i<=4'd0;
           rData<=9'b100000000;
                isSPI_Start<=1'b0;
                isDone<=1'b0;
                delaycn<=32'b0;//延时计数器清零
          end
          else begin
            //delaycn<=delaycn+1'b1;//延时计数器计数
           if(Start_Sig)
           case(i)               
                4'd0:
                begin
                  if(SPI_Done_Sig)begin isSPI_Start<=1'b0;i<=i+1'b1;end
                  else begin rData<=9'b000010111;isSPI_Start<=1'b1;end
                end
               
                4'd1:
                begin
                  if(SPI_Done_Sig)begin isSPI_Start<=1'b0;i<=i+1'b1;end
                  else begin rData<=9'b000101101;isSPI_Start<=1'b1;end
                end
                4'd2:
                begin
                if(delaycn<5000000)begin i<=4'd2;delaycn<=delaycn+1'b1; end
                 else begin delaycn<=32'b0;i<=i+1'b1;end
           end
4'd3:
                begin
                  if(SPI_Done_Sig)begin isSPI_Start<=1'b0;i<=i+1'b1;end
                  else begin rData<=9'b000101001;isSPI_Start<=1'b1;end
                end

        
                4'd4:
                begin rData<=9'b100000000;isDone<=1'b1;i<=i+1'b1;end
        
                4'd5:
                begin isDone<=1'b0;i<=4'd0;end
               
                endcase
                end
          end
assign Done_Sig=isDone;
assign SPI_Start_Sig=isSPI_Start;
assign SPI_Data=rData;
endmodule

module spi_write_module(
    CLK,
    RSTn,
    Start_Sig,
    SPI_Data,
    Done_Sig,
    SPI_Out
    );
  input CLK;
  input RSTn;
  input Start_Sig;
  input [8:0] SPI_Data;//8位spi数据+1位读写位
  output Done_Sig;
  output [2:0] SPI_Out;
  parameter TOPSUS=4'd3;//设置分频数
  reg [3:0] Count1;
  reg [4:0] i;//
  reg SPI_CS; //
  reg rCLK;//SCL 空闲时为高电平
  reg rDO;//SDA
  reg isDone;
  always@(posedge CLK or negedge RSTn)begin
   if(!RSTn)Count1<=4'd0;
        else if(Count1==TOPSUS) Count1<=4'd0;
        else if(Start_Sig)Count1<=Count1+1'b1;
        else Count1<=4'd0;
  end
   
        always@(posedge CLK or negedge RSTn)begin
        if(!RSTn)begin
        i<=5'd0;
        rCLK<=1'b0;
        rDO<=1'b0;
        isDone<=1'b0;
        SPI_CS<=1'b1;//CS 空闲时为高电平
        end
        else if(Start_Sig)begin
        //SPI_CS<=1'b0;
         case(i)
          5'd0:
          begin
          if(Count1==TOPSUS)begin
          rCLK<=1'b1;SPI_CS<=1'b1;i<=i+1'b1;
          end
          end
          5'd1://SCL下降沿数据开始建立
          if(Count1==TOPSUS)begin
          SPI_CS<=1'b0;rCLK<=1'b0;rDO<=(SPI_Data[8]&&1'b1);i<=i+1'b1;
          end                                              //SCL下降沿数据开始建立
           5'd3://SCL下降沿数据开始建立
          if(Count1==TOPSUS)begin
          rCLK<=1'b0;rDO<=(SPI_Data[7]&&1'b1);i<=i+1'b1;
          end                                              //SCL下降沿数据开始建立
           5'd5://SCL下降沿数据开始建立
          if(Count1==TOPSUS)begin
          rCLK<=1'b0;rDO<=(SPI_Data[6]&&1'b1);i<=i+1'b1;
          end                                              //SCL下降沿数据开始建立
           5'd7://SCL下降沿数据开始建立
          if(Count1==TOPSUS)begin
          rCLK<=1'b0;rDO<=(SPI_Data[5]&&1'b1);i<=i+1'b1;
          end                                              //SCL下降沿数据开始建立
          5'd9://SCL下降沿数据开始建立
          if(Count1==TOPSUS)begin
          rCLK<=1'b0;rDO<=(SPI_Data[4]&&1'b1);i<=i+1'b1;
          end                                              //SCL下降沿数据开始建立
          5'd11://SCL下降沿数据开始建立
          if(Count1==TOPSUS)begin
          rCLK<=1'b0;rDO<=(SPI_Data[3]&&1'b1);i<=i+1'b1;
          end                                              //SCL下降沿数据开始建立
           5'd13://SCL下降沿数据开始建立
          if(Count1==TOPSUS)begin
          rCLK<=1'b0;rDO<=(SPI_Data[2]&&1'b1);i<=i+1'b1;
          end                                              //SCL下降沿数据开始建立
          5'd15://SCL下降沿数据开始建立
          if(Count1==TOPSUS)begin
          rCLK<=1'b0;rDO<=(SPI_Data[1]&&1'b1);i<=i+1'b1;
          end                                              //SCL下降沿数据开始建立
          5'd17://SCL下降沿数据开始建立
          if(Count1==TOPSUS)begin
          rCLK<=1'b0;rDO<=(SPI_Data[0]&&1'b1);i<=i+1'b1;
          end                                              //SCL下降沿数据开始建立
          5'd2,5'd4,5'd6,5'd8,5'd10,5'd12,5'd14,5'd16,5'd18: //SCL上升沿数据开始采集
          if(Count1==TOPSUS)begin
          rCLK<=1'b1;i<=i+1'b1;
          end
     5'd19:
     if(Count1==TOPSUS)
           begin rCLK<=1'b0;i<=i+1'b1;end          //SCL上升沿数据开始采集
          5'd20:
          if(Count1==TOPSUS)begin isDone<=1'b1; rCLK<=1'b0;i<=i+1'b1;SPI_CS<=1'b1;end
          5'd21:
          begin isDone<=1'b0;i<=5'd0;SPI_CS<=1'b1;end
          endcase
         end
        end
        assign Done_Sig=isDone;
        assign SPI_Out={SPI_CS,rCLK,rDO};
endmodule
发表于 2011-9-15 21:36:58 | 显示全部楼层
这种代码实在是。。。。。懒得看
 楼主| 发表于 2011-9-16 09:50:02 | 显示全部楼层
回复 2# remnant


  懒得看?  愿闻其详:我是刚接触,菜是肯定的,比不得你这种大牛人,还请多指教,相信我会越来越精通的
发表于 2011-9-16 10:21:44 | 显示全部楼层
建议改成每个always块 只操作一个变量。你写成这么乱真没人愿意看。
发表于 2011-9-16 10:24:38 | 显示全部楼层
还有状态机最好参数化利于理解,用三段式或两段式写把状态跳转和变量操作分开。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-22 19:06 , Processed in 0.022995 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表