SPI和CPLD之间的通讯问题

2019-07-20 03:53发布

由于将之前的芯片换成了STM32,但是现在SPI怎么都调不通。在换芯片之前的MCU和CPLD之间的通讯是没有问题的。现在问题是,我用示波器测量STM32相应管脚的输出都没有问题,但是CPLD总是做不出相应正确的反应。希望哪位大神帮我找找到底是程序哪里有问题???顺便想问问NSS软件控制到底是怎么个工作模式??附:比较奇怪的是我现在NSS采用的是软件控制,但是我在操作时如果用示波器探头触碰NSS管脚在拿开,CPLD就可以做出一部分正确的操作反应。诚心求解

///////////////////////////////////////////////////////////////////////////
------------------------------------------------------------------------------------------------------------------
File Name: SPIInterface.v
Description: SPI从机接收电路,用于以下格式SPI总线从机的数据接收:
                                 Freescale SPI Slave Interface SPO = 0, SPH = 0
------------------------------------------------------------------------------------------------------------------
Modify:
*****************************************************************************************************************/

module SPIInterface(       
        input MOSI,SCK,CS,                                        //SPI总线信号
        output reg [15:0] Data                                //16位数据输出       
);

reg [3:0] SCKCounter;

//Count the SCK pulse
always @ ( negedge SCK ) begin
        if ( 1'b0 == CS ) begin
                if( 'b1111 == SCKCounter)
                        SCKCounter <= 'b0000;
                else
                        SCKCounter <= SCKCounter + 1'b1;
        end
        else
                SCKCounter <= 'b0000;
end

//Get the data
always @ ( posedge SCK ) begin
        if ( 1'b0 == CS ) begin
                case( SCKCounter )
                        'd0:         Data[15] <= MOSI;
                        'd1:         Data[14] <= MOSI;
                        'd2:         Data[13] <= MOSI;
                        'd3:         Data[12] <= MOSI;
                        'd4:         Data[11] <= MOSI;
                        'd5:         Data[10] <= MOSI;
                        'd6:         Data[9] <= MOSI;
                        'd7:         Data[8] <= MOSI;
                        'd8:         Data[7] <= MOSI;
                        'd9:         Data[6] <= MOSI;
                        'd10:         Data[5] <= MOSI;
                        'd11:         Data[4] <= MOSI;
                        'd12:         Data[3] <= MOSI;
                        'd13:         Data[2] <= MOSI;
                        'd14:         Data[1] <= MOSI;
                        'd15:         Data[0] <= MOSI;
                endcase
        end
end

endmodule

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
------------------------------------------------------------------------------------------------------------------
File Name:
Description: SPI主机发送模块
------------------------------------------------------------------------------------------------------------------       
       GPIO_InitTypeDef GPIO_InitStructure;
        SPI_InitTypeDef  SPI_InitStructure;

        RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能
        RCC_APB1PeriphClockCmd(        RCC_APB1Periph_SPI2,  ENABLE );//SPI2时钟使能        

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PB13/14/15复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB

        GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);  //PB13/14/15上拉

        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //设置SPI工作模式:设置为主SPI
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;                //设置SPI的数据大小:SPI发送接收8位帧结构
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                //串行同步时钟的空闲状态为低电平  CPOL=0
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;        //串行同步时钟的第一个跳变沿(上升或下降)数据被采样   CPHA=0
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;                //定义波特率预分频的值:波特率预分频值为32
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
        SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRC值计算的多项式
        SPI_Init(SPI2, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器

        SPI_Cmd(SPI2, ENABLE); //使能SPI外设



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
beibei
1楼-- · 2019-07-20 05:22
 精彩回答 2  元偷偷看……
beibei
2楼-- · 2019-07-20 07:39
 精彩回答 2  元偷偷看……
xuande
3楼-- · 2019-07-20 10:08

NSS管脚的软件控制,我还没搞懂,
所以不答,等高手。

verilog程序,两个问题:
1、你没有复位逻辑,SCKCounter初值是不定的,加电后可能是任意值。
2、用sck做系统时钟,会带来一些问题,我还说不好。

先解决第1个问题吧。感觉要加个外部时钟。


beibei
4楼-- · 2019-07-20 13:46
顶一下,继续求解答
walker_he
5楼-- · 2019-07-20 19:10
 精彩回答 2  元偷偷看……
walker_he
6楼-- · 2019-07-21 00:12
 精彩回答 2  元偷偷看……

一周热门 更多>