新手,跪求spi串口程序

2019-07-15 23:07发布

新手,真心求助。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
16条回答
Heng_Ji
2019-07-17 12:07
  1. module spi_transfer
  2. (
  3.         //global clock
  4.         input                                clk,
  5.         input                                rst_n,
  6.        
  7.         //mcu spi interface
  8.         input                                spi_cs,                //Chip select enable, default:L
  9.         input                                spi_sck        ,        //Data transfer clock
  10. //        input                                spi_mosi,        //Master output and slave input
  11.         output        reg                        spi_miso,        //Master input and slave output

  12.         //user interface               
  13.         input                                txd_en,                //Transfer enable
  14.         input                [7:0]        txd_data,        //Transfer data
  15.         output        reg                        txd_flag        //Transfer complete signal
  16. );

  17. //-------------------------------------
  18. //mcu data sync to fpga
  19. reg        spi_cs_r0,                 spi_cs_r1;               
  20. reg        spi_sck_r0,                spi_sck_r1;                //fsmc default 0; 8080 default 1; spi default 1;
  21. always@(posedge clk or negedge rst_n)
  22. begin
  23.         if(!rst_n)
  24.                 begin
  25.                 spi_cs_r0 <= 1;                spi_cs_r1 <= 1;                //chip select enable
  26.                 spi_sck_r0 <= 0;        spi_sck_r1 <= 0;        //data transfer clock
  27.                 end
  28.         else
  29.                 begin
  30.                 spi_cs_r0 <= spi_cs;                spi_cs_r1 <= spi_cs_r0;
  31.                 spi_sck_r0 <= spi_sck;                 spi_sck_r1 <= spi_sck_r0;
  32.                 end
  33. end
  34. wire        mcu_cs = spi_cs_r1;       
  35. wire        mcu_write_flag = (spi_sck_r1 & ~spi_sck_r0) ? 1'b1 : 1'b0;        //nededge of sck
  36. wire        mcu_write_done = (~spi_cs_r1 & spi_cs_r0) ? 1'b1 : 1'b0;        //posedge of cs


  37. //-------------------------------------
  38. //shift signal, transfer data
  39. localparam        SPI_MISO_DEFAULT = 1'b1;
  40. localparam        T_IDLE        =        1'b0;        //test the flag to transfer data
  41. localparam        T_SEND        =        1'b1;        //spi transfer data
  42. reg        [1:0]        txd_state;
  43. reg        [3:0]        txd_cnt;
  44. always@(posedge clk or negedge rst_n)
  45. begin
  46.         if(!rst_n)
  47.                 begin
  48.                 spi_miso <= SPI_MISO_DEFAULT;
  49.                 txd_cnt <= 0;
  50.                 txd_state <= 0;
  51.                 end
  52.         else
  53.                 begin
  54.                 case(txd_state)
  55.                 T_IDLE:        //test the flag to transfer data
  56.                         begin
  57.                         spi_miso <= SPI_MISO_DEFAULT;
  58.                         txd_cnt <= 0;
  59.                         if(txd_en)
  60.                                 txd_state <= T_SEND;
  61.                         else
  62.                                 txd_state <= T_IDLE;
  63.                         end       
  64.                 T_SEND:        //spi transfer data
  65.                         begin
  66.                         if(mcu_write_done == 1'b1)
  67.                                 txd_state <= T_IDLE;
  68.                         else
  69.                                 txd_state <= T_SEND;
  70.                                
  71.                         if(mcu_cs == 1'b0)
  72.                                 begin
  73.                                 if(mcu_write_flag)                //spi sck negedge
  74.                                         begin
  75.                                         spi_miso <= txd_data[3'd7 - txd_cnt[2:0]];
  76.                                         txd_cnt <= txd_cnt + 1'b1;
  77.                                         end
  78.                                 else
  79.                                         begin
  80.                                         spi_miso <= spi_miso;
  81.                                         txd_cnt <= txd_cnt;
  82.                                         end
  83.                                 end
  84.                         else
  85.                                 begin
  86.                                 spi_miso <= SPI_MISO_DEFAULT;
  87.                                 txd_cnt <= 0;
  88.                                 end
  89.                         end
  90.                 endcase
  91.                 end
  92. end


  93. //-------------------------------------------------
  94. //output spi transfer flag
  95. always@(posedge clk or negedge rst_n)
  96. begin
  97.         if(!rst_n)
  98.                 txd_flag <= 0;
  99.         else
  100.                 txd_flag <= mcu_write_done;
  101. end


  102. endmodule
复制代码

一周热门 更多>