STM32F7 SPI DMA接收 收不到数据

2019-07-20 07:49发布

各位大神最近在用STM32F7调试SPI,STM32F7作为从机接收,想把接收到的数据DMA到SDRAM里,但是用DMA的时候一直接收不到数据,DMA中断也进不去,但是用 HAL_SPI_Receive(&SPI2_Handler,(vu8*)(Bank5_SDRAM_ADDR + j),1024,1000);这个函数就能接收到数据,不知怎么回事,查了好多资料都没能解决,求帮助。。。[mw_shl_code=applescript,true]#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "spi.h"
#include "sdram.h"
#include "dma.h"

u8 Buffer[1000];
u8 testsram[250000] __attribute__((at(0XC0000000)));//测试用数组

//SDRAM内存测试            
void fsmc_sdram_test(u16 x,u16 y)
{  
        u32 i=0;            
        u32 temp=0;          
        u32 sval=0;        //在地址0读到的数据                                            
//          LCD_ShowString(x,y,180,y+16,16,"Ex Memory Test:    0KB ");
        //每隔16K字节,写入一个数据,总共写入2048个数据,刚好是32M字节
        for(i=0;i<32*1024*1024;i+=2)
        {
                *(vu16*)(Bank5_SDRAM_ADDR+i)=0x55aa;
                temp++;
        }
        //依次读出之前写入的数据,进行校验                  
//         for(i=0;i<32*1024*1024;i+=16*1024)
//        {       
//                  temp=*(vu32*)(Bank5_SDRAM_ADDR+i);
//                if(i==0)sval=temp;
//                 else if(temp<=sval)break;//后面读出的数据一定要比第一次读到的数据大.                             
//                LCD_ShowxNum(x+15*8,y,(u16)(temp-sval+1)*16,5,16,0);        //显示内存容量  
//                printf("SDRAM Capacity:%dKB ",(u16)(temp-sval+1)*16);//打印SDRAM容量
//         }                                         
}       

int main(void)
{
        u8 key;                 

        u32 i=0,j=0;             
        u32 ts=0;
    Cache_Enable();                 //打开L1-Cache
    HAL_Init();                                        //初始化HAL库
    Stm32_Clock_Init(432,25,2,9);   //设置时钟,216Mhz
    delay_init(216);                //延时初始化
        uart_init(115200);                        //串口初始化
    LED_Init();                     //初始化LED
    KEY_Init();                     //初始化按键
    SDRAM_Init();                   //初始化SDRAM
          SPI2_Init();
        MYDMA_Config(DMA1_Stream3,DMA_CHANNEL_0);

//    for(ts=0;ts<250000;ts++)
//        {
//                testsram[ts]=ts;//预存测试数据         
//          }
       
        for(i=0;i<32*1024*1024;i+=1)
        {
                *(vu8*)(Bank5_SDRAM_ADDR+i)=0;

        }
    while(1)
    {
//                        SPI_WR_BUSY(SPI2);
//       while((SPI2->SR & 1<<7)==1);                       
//             HAL_SPI_Receive(&SPI2_Handler,(vu8*)(Bank5_SDRAM_ADDR + j),1024,1000);
//                         i+=1000;
                          delay_ms(1);
//                        HAL_SPI_Receive_DMA(&SPI2_Handler,(vu8*)(Bank5_SDRAM_ADDR + j),10);
          }
}
[/mw_shl_code]

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
刺客mfl
1楼-- · 2019-07-20 09:24
 精彩回答 2  元偷偷看……
刺客mfl
2楼-- · 2019-07-20 13:54
[mw_shl_code=applescript,true]#include "spi.h"
//////////////////////////////////////////////////////////////////////////////////         
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32F7开发板
//SPI驱动代码          
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//创建日期:2015/12/30
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2014-2024
//All rights reserved                                                                          
//////////////////////////////////////////////////////////////////////////////////        

SPI_HandleTypeDef SPI2_Handler;  //SPI2句柄

//以下是SPI模块的初始化代码,配置成主机模式                                                   
//SPI口初始化
//这里针是对SPI2的初始化
void SPI2_Init(void)
{
    SPI2_Handler.Instance=SPI2;                      //SP2
    SPI2_Handler.Init.Mode=SPI_MODE_SLAVE;          //设置SPI工作模式,设置为主模式
    SPI2_Handler.Init.Direction=SPI_DIRECTION_2LINES;//设置SPI单向或者双向的数据模式:SPI设置为双线模式
    SPI2_Handler.Init.DataSize=SPI_DATASIZE_8BIT;    //设置SPI的数据大小:SPI发送接收8位帧结构
    SPI2_Handler.Init.CLKPolarity=SPI_POLARITY_HIGH; //串行同步时钟的空闲状态为高电平
    SPI2_Handler.Init.CLKPhase=SPI_PHASE_2EDGE;      //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
    SPI2_Handler.Init.NSS=SPI_NSS_HARD_INPUT;              //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
//    SPI2_Handler.Init.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_256;//定义波特率预分频的值:波特率预分频值为256
    SPI2_Handler.Init.FirstBit=SPI_FIRSTBIT_MSB;     //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
    SPI2_Handler.Init.TIMode=SPI_TIMODE_ENABLE;     //关闭TI模式
    SPI2_Handler.Init.CRCCalculation=SPI_CRCCALCULATION_DISABLE;//关闭硬件CRC校验
    SPI2_Handler.Init.CRCPolynomial=7;               //CRC值计算的多项式
    SPI2_Handler.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
    HAL_SPI_Init(&SPI2_Handler);
   
    __HAL_SPI_ENABLE(&SPI2_Handler);                 //使能SPI2
//    SPI2_ReadWriteByte(0Xff);                        //启动传输
}

//SPI2底层驱动,时钟使能,引脚配置
//此函数会被HAL_SPI_Init()调用
//hspi:SPI句柄
void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
{
    GPIO_InitTypeDef GPIO_Initure;
   
    __HAL_RCC_GPIOB_CLK_ENABLE();                   //使能GPIOF时钟
          __HAL_RCC_GPIOI_CLK_ENABLE();
    __HAL_RCC_SPI2_CLK_ENABLE();                    //使能SPI2时钟
   
    //PB13,14,15
    GPIO_Initure.Pin=GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
    GPIO_Initure.Mode=GPIO_MODE_AF_PP;              //复用推挽输出
    GPIO_Initure.Pull=GPIO_PULLUP;                  //上拉
    GPIO_Initure.Speed=GPIO_SPEED_FAST;             //快速   
    GPIO_Initure.Alternate=GPIO_AF5_SPI2;           //复用为SPI2
    HAL_GPIO_Init(GPIOB,&GPIO_Initure);             //初始化
//       
          GPIO_Initure.Pin=GPIO_PIN_0;;
    GPIO_Initure.Mode=GPIO_MODE_AF_PP;              //复用推挽输出
    GPIO_Initure.Pull=GPIO_PULLUP;                  //上拉
    GPIO_Initure.Speed=GPIO_SPEED_FAST;             //快速   
    GPIO_Initure.Alternate=GPIO_AF5_SPI2;           //复用为SPI2
    HAL_GPIO_Init(GPIOI,&GPIO_Initure);             //初始化
       
}

//SPI速度设置函数
//SPI速度=fAPB1/分频系数
//@ref SPI_BaudRate_Prescaler:SPI_BAUDRATEPRESCALER_2~SPI_BAUDRATEPRESCALER_2 256
//fAPB1时钟一般为54Mhz:
void SPI2_SetSpeed(u8 SPI_BaudRatePrescaler)
{
    assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));//判断有效性
    __HAL_SPI_DISABLE(&SPI2_Handler);            //关闭SPI
    SPI2_Handler.Instance->CR1&=0XFFC7;          //位3-5清零,用来设置波特率
    SPI2_Handler.Instance->CR1|=SPI_BaudRatePrescaler;//设置SPI速度
    __HAL_SPI_ENABLE(&SPI2_Handler);             //使能SPI
   
}

//SPI2 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
u8 SPI2_ReadWriteByte(u8 TxData)
{
    u8 Rxdata;
    HAL_SPI_TransmitReceive(&SPI2_Handler,&TxData,&Rxdata,1, 1000);      
        return Rxdata;                              //返回收到的数据               
}
[/mw_shl_code]
正点原子
3楼-- · 2019-07-20 16:07
 精彩回答 2  元偷偷看……
刺客mfl
4楼-- · 2019-07-20 19:44
 精彩回答 2  元偷偷看……
刺客mfl
5楼-- · 2019-07-20 21:46
有大神配置过SPI 的接收中断吗
旮旯旭
6楼-- · 2019-07-21 03:05
本帖最后由 旮旯旭 于 2018-6-8 15:14 编辑

我在F1 F4上实现过 SPI DMA接收,速度比MCU控制的快3倍

一周热门 更多>