社区导航

 

搜索
查看: 1543|回复: 2

[求助] FPGA-spi问题

[复制链接]

5

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-4-19 20:00 | 显示全部楼层 |阅读模式
问大家一个SPI问题,ARM采用am335X作为主机,FPGA作为从机,模式是3模式,即CPOL=1,CPHA=1,我在FPGA检测SCK的上升沿和CS_n为低电平时,进行把MOSI数据放入缓存器中,当然现在传输数据是没问题,最大的问题是,ARM连续发数据时,假如连续发1和2,sck设定5MHZ时钟,FPGA的时钟要达到600MHZ才能检测出来1和2,FPGA时钟慢了,只能收到一个数据2,大家可以帮分析下,是什么原因吗?
此帖出自FPGA/CPLD论坛


回复

使用道具 举报

28

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2018-4-20 15:43 | 显示全部楼层
你的检测方式有问题的,理论上只要大于2倍SPI时钟速率就可以的


回复

使用道具 举报

5

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

 楼主| 发表于 2018-4-20 16:42 | 显示全部楼层
hh_kings 发表于 2018-4-20 15:43
你的检测方式有问题的,理论上只要大于2倍SPI时钟速率就可以的

你好,对呀,这个理论上是这样,但是却差得远,现在是ARM在SCK下降沿开始发送数据,FPGA在上升沿进行数据采样,不应该有问题呀,正好把数据采集过来,你看下代码,希望能给出建议
//同步寄存器,消除亚稳态
always@(posedge clk or negedge rst_n)
        if(!rst_n)begin
                s0 <= 1'b0;
                s1 <= 1'b0;       
        end
        else begin
                s0 <= SCK;
                s1 <= s0;       
        end
//数据寄存器
always@(posedge clk or negedge rst_n)
        if(!rst_n)begin
                t0 <= 1'b0;
                t1 <= 1'b0;       
        end
        else begin
                t0 <= s1;
                t1 <= t0;       
        end
always@(posedge clk or negedge rst_n)
begin
    if(!rst_n)
        begin
            sck_r0 <= 1'b0;   //sck of the idle state is high
            sck_r1 <= 1'b0;
        end
    else
        begin
            sck_r0 <= t1;
            sck_r1 <= sck_r0;
        end
end

assign sck_n = (!sck_r0 & sck_r1);   //capture the sck negedge
assign sck_p = (sck_r0 & !sck_r1);   //capture the sck posedge

//-----------------------spi_slaver read data-------------------------------
always@(posedge clk or negedge rst_n)
begin
    if(!rst_n)
        begin
            rxd_data <= 1'b0;
            rxd_flag_r <= 1'b0;
            rxd_state <= 1'b0;
        end
    else if(sck_p && !CS_N)   
        begin
            case(rxd_state)
                4'd0:begin
                        rxd_data[7] <= MOSI;
                        rxd_flag_r <= 1'b0;   //reset rxd_flag
                        rxd_state <= 4'd1;
                      end
                4'd1:begin
                        rxd_data[6] <= MOSI;
                        rxd_state <= 4'd2;
                      end
                4'd2:begin
                        rxd_data[5] <= MOSI;
                        rxd_state <= 4'd3;
                      end
                4'd3:begin
                        rxd_data[4] <= MOSI;
                        rxd_state <= 4'd4;
                      end
                4'd4:begin
                        rxd_data[3] <= MOSI;
                        rxd_state <= 4'd5;
                      end
                4'd5:begin
                        rxd_data[2] <= MOSI;
                        rxd_state <= 4'd6;
                      end
                4'd6:begin
                        rxd_data[1] <= MOSI;
                        rxd_state <= 4'd7;
                      end
                4'd7:begin
                        rxd_data[0] <= MOSI;
                        rxd_flag_r <= 1'b1;   //reset rxd_flag
                        rxd_state <= 4'd0;
                      end                                       
                default: ;
            endcase
        end
end


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 1/7 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-5-27 11:35 , Processed in 0.147667 second(s), 23 queries , Gzip On, MemCache On.

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