搜索
bottom↓
回复: 3

STM32和FPGA通信,有问题,帮帮忙吧!

[复制链接]

出0入0汤圆

发表于 2013-7-18 15:10:52 | 显示全部楼层 |阅读模式
单片机部分:
#include "spi.h"
#include "sys.h"
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    /*SPI1 pins: SS,SCK and MOSI ---------------------------------*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}

uint8_t SPI_Read_Write(uint8_t data)
{
    uint8_t i=0,receive=0,temp;
   // SS_L(); //ss low  
    for(i=0;i<8;i++)   
    {
      receive<<=1;
      temp=data&0x80;
      if(temp==0x80)
      {
        GPIO_SetBits(GPIOA,GPIO_Pin_6);
      }
      else
      {
        GPIO_ResetBits(GPIOA,GPIO_Pin_6);
      }         
        GPIO_SetBits(GPIOA,GPIO_Pin_4);          //SCK
                GPIO_SetBits(GPIOA,GPIO_Pin_4);
                GPIO_SetBits(GPIOA,GPIO_Pin_4);
        GPIO_ResetBits(GPIOA,GPIO_Pin_4);
                GPIO_ResetBits(GPIOA,GPIO_Pin_4);
                GPIO_ResetBits(GPIOA,GPIO_Pin_4);
        if(MISO==1)   //MISO
        {
                  receive|=0x01;
        }
        else
        {
                  receive&=~0x01;
        }           
      data=data<<1;
    }
    return receive;
}

void SPI_Write_Byte(uint8_t data)
{
        SPI_Read_Write(data);
}

uint8_t SPI_Read_Byte(void)
{  
        return SPI_Read_Write(0x00);
}

void SPI_Write_4Byte(uint32_t data)
{
    uint8_t data0,data1,data2,data3;
    data0=(uint8_t)data;
    data1=(uint8_t)(data>>8);
    data2=(uint8_t)(data>>16);
    data3=(uint8_t)(data>>24);
    GPIO_ResetBits(GPIOA,GPIO_Pin_3);         //SS
    SPI_Read_Write(data3);
    SPI_Read_Write(data2);
    SPI_Read_Write(data1);
    SPI_Read_Write(data0);
    GPIO_SetBits(GPIOA,GPIO_Pin_3);     
}
主函数就是一句话:SPI_Write_4Byte(6);

FPGA部分:
module spi_comm(sck,mosi,miso,ss,data_out,data_in,rst_n);
input sck,mosi,ss,rst_n;
input [31:0] data_in;
output miso;
output[31:0] data_out;
reg miso;
reg[4:0] bit_count;
reg[31:0] data_out,rxd;

always@(posedge sck)   
        begin
        if(ss==0)
                miso=data_in[31-bit_count];
        end

always@(negedge sck or posedge ss)
begin
        if(ss)
                bit_count=0;
        else
                begin
                rxd=rxd<<1;
                rxd[0]=mosi;
                if(bit_count==31)
                        data_out=rxd;
                else  data_out=32'h00000000;
                bit_count=bit_count+1;
                end
        end
endmodule

目的是当FPGA接收到6的时候数码管显示数字,但是不成功,求大神指教!!

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2013-7-19 16:12:47 | 显示全部楼层
本帖最后由 I爱电子 于 2013-7-19 16:15 编辑

void SPI1_Init(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
  NVIC_InitTypeDef  NVIC_InitStructure;       
  SPI_InitTypeDef   SPI_InitStructure;       
       
        SPI_I2S_DeInit(SPI1);
        //SPI1 时钟配置
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1, ENABLE);       
        //SPI1 IO配置
        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
  //个人理解:保持和设置的总线稳态电平一致
        GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
       
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
        SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;                                    //设置SPI工作模式:设置为从SPI
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                                //设置SPI的数据大小:SPI发送接收8位帧结构
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                                      //选择了串行时钟的稳态:时钟悬空高
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                              //数据捕获于第二个时钟沿
        SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;                                        //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;//从机的预分频值无效
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
        SPI_InitStructure.SPI_CRCPolynomial = 7;                                  //CRC值计算的多项式
        SPI_Init(SPI1, &SPI_InitStructure);                                 //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
  
        SPI_I2S_ITConfig(SPI1,SPI_I2S_IT_TXE,ENABLE);
       
        NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
       
        SPI_I2S_SendData(SPI1,0xFF);
        //SPI_I2S_ReceiveData(SPI1);
        //SPI使能
        SPI_Cmd(SPI1,ENABLE);
       
        //SPI_I2S_SendData(SPI1,0xFF);
}



这段是stm32作为从机时的spi初始化,你参考一下这段代码。

出0入0汤圆

发表于 2013-7-21 21:44:36 | 显示全部楼层
FPGA 你怎么判断是6那? 这个就是通讯简单的接口硬件实现,并没有做数据判断,你想实现的东西在什么地方体现?

出0入0汤圆

发表于 2013-7-21 21:50:09 | 显示全部楼层
你要是data_out输出的话,你先做   GPIO_ResetBits(GPIOA,GPIO_Pin_3);         //SS   
然后    GPIO_SetBits(GPIOA,GPIO_Pin_3);  
为的是   if(ss)
                bit_count=0; 清下零

最后你看看你的spi输出方式 是时钟的那类沿输出数据,要和你的fpga相同!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 08:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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