CH32V303RCT6的SPI 问题

SPI设置软件片选,结果通信是引脚一拉低就又被拉高了。波形如下

1688533297183.png

代码如下:

#include "debug.h"


#define SPI1_CLK                RCC_APB2Periph_SPI1

#define SPI1_GPIO               GPIOA

#define SPI1_GPIO_CLK           RCC_APB2Periph_GPIOA

#define SPI1_PIN_SCK            GPIO_Pin_5

#define SPI1_PIN_MISO           GPIO_Pin_6

#define SPI1_PIN_MOSI           GPIO_Pin_7

#define SPI1_PIN_SS             GPIO_Pin_4


/* Global typedef */


/* Global define */


/* Global Variable */


void SPI1_FullDuplex_Init(void);

void TEMPE1_Init(void);

/*********************************************************************

 * @fn      main

 *

 * @brief   Main program.

 *

 * @return  none

 */

int main(void)

{

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

SystemCoreClockUpdate();

Delay_Init();

// USART_Printf_Init(115200);

// printf("SystemClk:%d\r\n",SystemCoreClock);

// printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );

// printf("This is printf example\r\n");

SPI1_FullDuplex_Init();


while(1)

    {

    Delay_Ms(500);

    TEMPE1_Init();

}

}

void TEMPE1_Init(void)

{

    GPIO_ResetBits(SPI1_GPIO, SPI1_PIN_SS);

    GPIO_ResetBits(SPI1_GPIO, SPI1_PIN_SS);


    while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

    SPI_I2S_SendData(SPI1, 0x80);

    while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

    SPI_I2S_SendData(SPI1, 0xd1);


    GPIO_SetBits(SPI1_GPIO, SPI1_PIN_SS);

}



void SPI1_FullDuplex_Init(void)

{


    GPIO_InitTypeDef GPIO_InitStructure = {0};

    SPI_InitTypeDef SPI_InitStructure = {0};


    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE );


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init( GPIOA, &GPIO_InitStructure );


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init( GPIOA, &GPIO_InitStructure );


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_Init( GPIOA, &GPIO_InitStructure );


    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;   // 双线全双工

    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;   // 主机模式

    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;   // 数据大小为8位

    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;   // 时钟极性为高电平

    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;   // 第2个时钟边沿采样数据

    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//SPI_NSS_Soft;   // 软件控制NSS//

    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;   // 波特率预分频器,这里设为256

    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;   // 数据传输的第一个位为最高位

    SPI_InitStructure.SPI_CRCPolynomial = 7;   // CRC校验


    SPI_Init( SPI1, &SPI_InitStructure );

    SPI_SSOutputCmd( SPI1, DISABLE );

    SPI_Cmd( SPI1, ENABLE );

    GPIO_SetBits(SPI1_GPIO, SPI1_PIN_SS);

    Delay_Ms(10);

}

icon_rar.gifCH32V303RCT6.rar

程序发送完数据判断一下BSY。image.pngimage.png


无效SPI1_FullDuplex_Init(无效)

{


GPIO_InitTypeDef GPIO_InitStructure = {0};

SPI_InitTypeDef SPI_InitStructure = {0};


RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA |RCC_APB2Periph_SPI1,启用);


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init( GPIOA, &GPIO_InitStructure );


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init( GPIOA, &GPIO_InitStructure );


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init( GPIOA, &GPIO_InitStructure );


SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;双线全双工

SPI_InitStructure.SPI_Mode = SPI_Mode_Master;主机模式

SPI_InitStructure.SPI_数据大小 = SPI_DataSize_8b;数据大小为8位

SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;时钟极性为低电平

SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;第2个时钟边沿采样数据

SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;//SPI_NSS_Soft;软件控制NSS//

SPI_InitStructure.SPI_波特率预分频器 = SPI_BaudRatePrescaler_256;波特率预分频器,这里设为256

SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;数据传输的第一个位为最高位

SPI_InitStructure.SPI_CRCPolynomial = 7;CRC校验


SPI_Init( SPI1, &SPI_InitStructure );

SPI_SSOutputCmd( SPI1, 启用 );

SPI_Cmd( SPI1, 启用 );

GPIO_SetBits(SPI1_GPIO、SPI1_PIN_SS);

Delay_Ms(10);

}



有没有硬件片选的例程,使用ch32v307中硬件片选例程修改的并不行,还会卡死在第一次发送。
在https://www.cnblogs.com/wchmcu/p/17340422.html,也有一个参考,两者不同,但也不行。

icon_rar.gifCH32V303RCT6.rar



在PA4接一个上拉电阻,发送完成后需要关闭SPI的使能,否则是一直拉低的状态,下次发送时再开启SPI的使能image.png


程序没有卡死了,但是硬件片选还是不行,片选引脚外部已上拉一个10k电阻。通过示波器观察,时钟是对的,片选一直为高。数据却忽略了0x80,只发了0xd1。while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);这个检查貌似没有效果。

1688613539388.png

icon_rar.gifCH32V303RCT6.rar



image.png

icon_rar.gifCH32V303RCT6.rar

这是用逻辑分析仪抓的,上面是代码,你测试一下。检查一下接线,你的PA4线怎么一直高电平,我这边是正常的


你发的这个工程可以


只有登录才能回复,可以选择微信账号登录