F429 SPI3使用问题

2019-07-20 01:22发布

本帖最后由 素怀 于 2018-4-19 18:13 编辑

我的程序原来在SPI1上面时成功的,但是改到SPI3就不行了,问了正点原子店铺的技术人员,他们说429是不需要禁用JTAG的。调了一整天就是没有通过。我用的引脚:CS-PA15,SCK-PB3,MOSI-PB5,MISO-PB4。如果不是禁用的问题的话,那就是我SPI3的配置是有问题的,但是我核对了很多遍,感觉没有错啊,请各位帮忙看一下吧。


[mw_shl_code=c,true]SPI_HandleTypeDef SPI3_Handler; //SPI 句柄
GPIO_InitTypeDef GPIO_Initure;
/*********SPI初始化SPI3************/
void LD3320_SPI_Cfg(void)
{       
        LD3320_CS=1;//CS初始化时置高,使用选择时置低
        SPI3_Init();
        SPI3_SetSpeed(SPI_BAUDRATEPRESCALER_2);//设置为45M时钟,高速模式
        printf("SPI初始化完成 ");
}

/*============SPI3层驱动,时钟使能,引脚配置=================*/
void SPI3_Init(void)
{
//        __HAL_RCC_SPI3_CLK_ENABLE(); //使能 SPI3 时钟
        __HAL_SPI_DISABLE(&SPI3_Handler);
       
        SPI3_Handler.Instance=SPI3; //SP1
        SPI3_Handler.Init.Mode=SPI_MODE_MASTER; //设置 SPI 工作模式,设置为主模式
        SPI3_Handler.Init.Direction=SPI_DIRECTION_2LINES; // SPI 设置为双线模式
        SPI3_Handler.Init.DataSize=SPI_DATASIZE_8BIT; // PI 发送接收 8 位帧结构
        SPI3_Handler.Init.CLKPolarity=SPI_POLARITY_HIGH; //注:官方源码为高,但官方注释上为低。同步时钟空闲状态为低电平
        SPI3_Handler.Init.CLKPhase=SPI_PHASE_1EDGE;//时钟相位 数据采样从第一个时钟边沿开始
        SPI3_Handler.Init.NSS=SPI_NSS_SOFT; //软件产生NSS       
        SPI3_Handler.Init.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_256;//定义波特率预分频的值:波特率预分频值为SYSCLK/128
        SPI3_Handler.Init.FirstBit=SPI_FIRSTBIT_MSB; //指定数据传输从 MSB 位开始,数据高位在前
        SPI3_Handler.Init.TIMode=SPI_TIMODE_DISABLE; //关闭 TI 模式
        SPI3_Handler.Init.CRCCalculation=SPI_CRCCALCULATION_DISABLE;//使能硬件 CRC
        SPI3_Handler.Init.CRCPolynomial=7; //CRC 值计算的多项式,CRC多项式寄存器初始值为7
        HAL_SPI_Init(&SPI3_Handler);//初始化
       
        __HAL_SPI_ENABLE(&SPI3_Handler); //使能 SPI1
       
//        spi_send_byte(0Xff);        //启动传输
        printf("SPI3_Init ");
}


/*============SPI3底层驱动,时钟使能,引脚配置=================*/
//此函数会被 HAL_SPI_Init()调用
void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
{
        if(hspi->Instance==SPI3)
        {
                __HAL_RCC_GPIOB_CLK_ENABLE(); //使能IO口时钟
                __HAL_RCC_SPI3_CLK_ENABLE(); //使能 SPI3 时钟
                __HAL_RCC_GPIOA_CLK_ENABLE();               

                GPIO_Initure.Pin=GPIO_PIN_4;  //CS
                GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
                GPIO_Initure.Speed=GPIO_SPEED_HIGH; //50MHz
                GPIO_Initure.Pull=GPIO_PULLUP; //上拉       
                HAL_GPIO_Init(GPIOA,&GPIO_Initure);
               
                GPIO_Initure.Pin=GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5;//SCK
                GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出       
                GPIO_Initure.Speed=GPIO_SPEED_HIGH;
                GPIO_Initure.Pull=GPIO_PULLUP;//上拉
                GPIO_Initure.Alternate=GPIO_AF6_SPI3; //复用为 SPI1
                HAL_GPIO_Init(GPIOB,&GPIO_Initure);       
               


        }[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
login_FAE
1楼-- · 2019-07-20 04:09
 精彩回答 2  元偷偷看……
素怀
2楼-- · 2019-07-20 08:39
暂时解决了一半问题,把我SPI3的接口改到了PC10、11、12,然后我的复用写错了,应该是GPIO_Initure.Alternate=GPIO_AF6_SPI3; 这样程序就调对了。但是又改回PB3、4、5,程序依旧不能正常运行
素怀
3楼-- · 2019-07-20 09:43
login_FAE 发表于 2018-4-19 17:55
[mw_shl_code=c,true]void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
{
    GPIO_InitTypeDef GPIO_Init ...

我一开始是这么写的,就是有问题,我也觉得这样写是对的
Cuuuuuu
4楼-- · 2019-07-20 13:40
 精彩回答 2  元偷偷看……

一周热门 更多>