硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2811|回复: 6
收起左侧

stm32F429 SPI3 配置为16位传输实际却是8位

[复制链接]

1

主题

3

回帖

13

积分

新手上路

积分
13
发表于 2018-6-14 17:49:47 | 显示全部楼层 |阅读模式
如题,PB3,PB4,PB5,PA15四个管脚既可以服用成SPI1,也可以复用成SPI3,配置为16位传输。当复用为SPI1时传输正常,而复用SPI3时,测量出的数据和时钟依然是8位的。两者其它配置完全一样,求大神解答!
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
发表于 2018-6-14 19:19:47 | 显示全部楼层
方便的话,直接贴代码看看。仅SPI部分即可。
回复

使用道具 举报

1

主题

3

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2018-6-14 19:35:55 | 显示全部楼层
eric2013 发表于 2018-6-14 19:19
方便的话,直接贴代码看看。仅SPI部分即可。
BSP_SPI_T gSpi3Struct = {
    {GPIOB, GPIO_Pin_5},                //MOSI
    {GPIOB, GPIO_Pin_4},                //MISO
    {GPIOA, GPIO_Pin_15},                //NSS
    {GPIOB, GPIO_Pin_3},                //CLK
    SPI3,
};

void fpga_config(void)
{
    /* ′ò?a GPIOE ê±?ó */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB, ENABLE);

    /* ′ò?a SPI ê±?ó */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
         
    /*SPI regster and port config*/
    SPI_PortConfig(&gSpi3Struct);

}


void SPI_PortConfig(BSP_SPI_T * pSPI_Struct)
{
    SPI_InitTypeDef   SPI_InitStructure;
    GPIO_InitTypeDef  GPIO_InitStructure;
        
    GPIO_PinAFConfig(pSPI_Struct->Clk.Port, GPIO_PinSource3, GPIO_AF_SPI3);
    GPIO_PinAFConfig(pSPI_Struct->Miso.Port, GPIO_PinSource4, GPIO_AF_SPI3);
    GPIO_PinAFConfig(pSPI_Struct->Mosi.Port, GPIO_PinSource5, GPIO_AF_SPI3);

    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_Init(pSPI_Struct->pSPI, &SPI_InitStructure);

    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        /*MOSI*/
          GPIO_InitStructure.GPIO_Pin = pSPI_Struct->Mosi.Pin;
    GPIO_Init(pSPI_Struct->Mosi.Port, &GPIO_InitStructure);
        /*MISO*/
    GPIO_InitStructure.GPIO_Pin = pSPI_Struct->Miso.Pin;
    GPIO_Init(pSPI_Struct->Miso.Port, &GPIO_InitStructure);
        /*CLK*/
          GPIO_InitStructure.GPIO_Pin = pSPI_Struct->Clk.Pin;
    GPIO_Init(pSPI_Struct->Clk.Port, &GPIO_InitStructure);

        if(SPI_IsNssHardMode(pSPI_Struct->pSPI) == pdFALSE)
        {
                /*NSS confiured software mode,so configure NSS pin as output*/
                GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
                GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
                GPIO_InitStructure.GPIO_Pin = pSPI_Struct->Nss.Pin;
                GPIO_Init(pSPI_Struct->Nss.Port, &GPIO_InitStructure);
        }
        else
        {
                /*NSS hardware mode*/
    GPIO_PinAFConfig(pSPI_Struct->Nss.Port, GPIO_PinSource15, GPIO_AF_SPI3);
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_Pin = pSPI_Struct->Nss.Pin;
    GPIO_Init(pSPI_Struct->Nss.Port, &GPIO_InitStructure);
        }

    GPIO_SetBits(pSPI_Struct->Nss.Port, pSPI_Struct->Nss.Pin);
    FPGA_read_EXTIConfig();
        
    SPI_Cmd(pSPI_Struct->pSPI, ENABLE);
}

SPI_DataTrans_Rec(BSP_SPI_T* pSPI_Struct, uint16_t *pData2Snd, uint16_t *pRcvBuf, uint16_t Length)
{
    uint16_t i;
          for(i = 0; i < Length; i++)
          {
        while (SPI_I2S_GetFlagStatus(pSPI_Struct->pSPI, SPI_I2S_FLAG_TXE) == RESET);
        SPI_I2S_SendData(pSPI_Struct->pSPI, *(pData2Snd + i));
                    
        while (SPI_I2S_GetFlagStatus(pSPI_Struct->pSPI, SPI_I2S_FLAG_RXNE) == RESET);
        *pRcvBuf++ = SPI_I2S_ReceiveData(pSPI_Struct->pSPI);
          }
}

void SPI_DataTransMst(BSP_SPI_T* pSPI_Struct, uint16_t * puhSndValue, uint16_t * puhRcvValue, uint16_t Length, SPI_DIR_MODE_E SPI_DirMode)
{

    if(SPI_IsNssHardMode(pSPI_Struct->pSPI) == pdFALSE)
    {
                if(pSPI_Struct->Nss.Port != NULL)
                {
                    GPIO_ResetBits(pSPI_Struct->Nss.Port, pSPI_Struct->Nss.Pin);
                    bsp_DelayUS(2);
                }
    }

    if((SPI_DirMode == SPI_DIR_FULL_DUP) || (SPI_DirMode ==SPI_DIR_READ_ONLY ))
    {        
        SPI_DataTrans_Rec(pSPI_Struct, puhSndValue, puhRcvValue, Length);
    }
    else if(SPI_DirMode == SPI_DIR_WRITE_ONLY)
                /*data transmit*/
        SPI_DataTransmit(pSPI_Struct, puhSndValue, Length);

    if(SPI_IsNssHardMode(pSPI_Struct->pSPI) == pdFALSE)
    {
        if(pSPI_Struct->Nss.Port != NULL)
        {
           GPIO_SetBits(pSPI_Struct->Nss.Port, pSPI_Struct->Nss.Pin);
           bsp_DelayUS(2);
       }
    }
}
回复

使用道具 举报

1

主题

3

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2018-6-14 19:37:23 | 显示全部楼层
图图_W2KV9 发表于 2018-6-14 19:35
BSP_SPI_T gSpi3Struct = {
    {GPIOB, GPIO_Pin_5},                //MOSI
    {GPIOB, GPIO_Pin_4},  ...

只把SPI3的相关部门改成SPI1,所有流程和配置都不变,就没问题
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
发表于 2018-6-14 19:50:37 | 显示全部楼层
图图_W2KV9 发表于 2018-6-14 19:37
只把SPI3的相关部门改成SPI1,所有流程和配置都不变,就没问题

注意一点,SPI1是挂在APB2总线上的,速度84MHz,而SPI3是挂载APB1总线上,速度42MHz
回复

使用道具 举报

1

主题

3

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2018-6-14 20:30:37 | 显示全部楼层
eric2013 发表于 2018-6-14 19:50
注意一点,SPI1是挂在APB2总线上的,速度84MHz,而SPI3是挂载APB1总线上,速度42MHz

那应该速率越低越稳定啊
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117530
QQ
发表于 2018-6-15 16:35:04 | 显示全部楼层
图图_W2KV9 发表于 2018-6-14 20:30
那应该速率越低越稳定啊

那就弄个逻辑分析仪试试看吧。

或直接对比寄存器,调试状态全速运行,两个都初始化了,看看寄存器上是不是有什么不同。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-13 06:15 , Processed in 0.043545 second(s), 30 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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