微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 新手,跪求spi串口程序

新手,跪求spi串口程序

时间:10-02 整理:3721RD 点击:
新手,真心求助。

什么芯片的

fpga.verilog,求助

求助,大神吗。

不好意思这个我不懂,没学

这个网上很多啊,你去找找就可以了。

木有呀,大神你有吗。。

木有呀,大神你有吗。。

这个....这个,可以说的具体点吗

基于fpga的spi程序都行,我主要参考一下,请问大神有吗

之前我用过一个,还可以,需要吗?

  1. module spi_receiver
  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                                spi_miso,        //Master input and slave output

  12.         //user interface       
  13.         output        reg                        rxd_flag,       
  14.         output        reg        [7:0]        rxd_data
  15. );

  16. //-------------------------------------
  17. //mcu data sync to fpga
  18. reg        spi_cs_r0,                 spi_cs_r1;               
  19. reg        spi_sck_r0,                spi_sck_r1;                //fsmc default 0; 8080 default 1; spi default 0;
  20. reg        spi_mosi_r0,         spi_mosi_r1;
  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.                 spi_mosi_r0 <= 0;        spi_mosi_r1 <= 0;        //Master output and slave input
  28.                 end
  29.         else
  30.                 begin
  31.                 spi_cs_r0 <= spi_cs;                spi_cs_r1 <= spi_cs_r0;
  32.                 spi_sck_r0 <= spi_sck;                 spi_sck_r1 <= spi_sck_r0;
  33.                 spi_mosi_r0 <= spi_mosi;        spi_mosi_r1 <= spi_mosi_r0;
  34.                 end
  35. end
  36. wire        mcu_cs = spi_cs_r1;       
  37. wire        mcu_data = spi_mosi_r1;
  38. wire        mcu_read_flag = (~spi_sck_r1 & spi_sck_r0) ? 1'b1 : 1'b0;        //posedge of sck
  39. wire        mcu_read_done = (~spi_cs_r1 & spi_cs_r0) ? 1'b1 : 1'b0;                //posedge of cs

  40. //-------------------------------------
  41. //sample signal, receive data
  42. reg        [3:0]        rxd_cnt;
  43. reg        [7:0]        rxd_data_r;
  44. always@(posedge clk or negedge rst_n)
  45. begin
  46.         if(!rst_n)
  47.                 begin
  48.                 rxd_cnt <= 0;
  49.                 rxd_data_r <= 0;
  50.                 end
  51.         else if(mcu_cs == 1'b0)
  52.                 begin
  53.                 if(mcu_read_flag)        //posedge of sck
  54.                         begin
  55.                         rxd_data_r[3'd7 - rxd_cnt[2:0]] <= mcu_data;
  56.                         rxd_cnt <= rxd_cnt + 1'b1;        //0-7-8
  57.                         end
  58.                 else
  59.                         begin
  60.                         rxd_cnt <= rxd_cnt;
  61.                         rxd_data_r <= rxd_data_r;
  62.                         end
  63.                 end
  64.         else
  65.                 begin
  66.                 rxd_cnt <= 0;
  67.                 rxd_data_r <= rxd_data_r;
  68.                 end
  69. end

  70. //-------------------------------------------------
  71. //output spi receive data and receive flag
  72. always@(posedge clk or negedge rst_n)
  73. begin
  74.         if(!rst_n)
  75.                 begin
  76.                 rxd_flag <= 0;
  77.                 rxd_data <= 0;
  78.                 end
  79.         else if(mcu_read_done)
  80.                 begin
  81.                 rxd_flag <= 1'b1;
  82.                 rxd_data <= rxd_data_r;
  83.                 end
  84.         else
  85.                 begin
  86.                 rxd_flag <= 0;
  87.                 rxd_data <= rxd_data;
  88.                 end
  89. end

  90. endmodule

复制代码

  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

复制代码

网上一大堆啊   

嗯,谢谢哈。

这个 SPI的程序,请问有没有验证过呀

同样学习学习         

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top