OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5059|回复: 9

SPI和CPLD之间的通讯问题

[复制链接]

15

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2016-9-26
在线时间
26 小时
发表于 2016-11-7 17:41:37 | 显示全部楼层 |阅读模式
5金钱
由于将之前的芯片换成了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外设



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2016-9-26
在线时间
26 小时
 楼主| 发表于 2016-11-7 17:43:41 | 显示全部楼层
附:NSS管脚在用示波器测量时一直都是低电平信号
回复

使用道具 举报

15

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2016-9-26
在线时间
26 小时
 楼主| 发表于 2016-11-7 20:37:20 | 显示全部楼层
顶一下
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11545
金钱
11545
注册时间
2014-4-1
在线时间
1315 小时
发表于 2016-11-7 20:49:25 | 显示全部楼层

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

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

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


回复

使用道具 举报

15

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2016-9-26
在线时间
26 小时
 楼主| 发表于 2016-11-8 09:04:21 | 显示全部楼层
顶一下,继续求解答
回复

使用道具 举报

2

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2015-8-7
在线时间
53 小时
发表于 2016-11-10 11:33:06 | 显示全部楼层
用的什么CPLD,用模拟SPI就行了,即使用硬件的建议不要用NSS
回复

使用道具 举报

2

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2015-8-7
在线时间
53 小时
发表于 2016-11-10 11:35:18 | 显示全部楼层
你是为了纯通信还是要通过被动模式进行配置(在线烧写 )
回复

使用道具 举报

15

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2016-9-26
在线时间
26 小时
 楼主| 发表于 2016-11-10 16:31:30 | 显示全部楼层
walker_he 发表于 2016-11-10 11:33
用的什么CPLD,用模拟SPI就行了,即使用硬件的建议不要用NSS

什么叫模拟SPI??
回复

使用道具 举报

15

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2016-9-26
在线时间
26 小时
 楼主| 发表于 2016-11-10 16:32:41 | 显示全部楼层
walker_he 发表于 2016-11-10 11:35
你是为了纯通信还是要通过被动模式进行配置(在线烧写 )

就是主要功能是通过不同的按键来发送不同的数据,来操控CPLD其实现不同的功能~
回复

使用道具 举报

2

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2017-11-10
在线时间
20 小时
发表于 2019-2-12 08:44:19 | 显示全部楼层
学习一下
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 20:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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