CH32V307WCU6 , 只要设置SPI_NSS_HARD, SPI发送就不工作

    GPIO_InitTypeDef GPIO_InitStructure = { 0 };

    SPI_InitTypeDef SPI_InitStructure = { 0 };


    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);

    RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI3, ENABLE);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;   //nss

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

    GPIO_Init( GPIOA, &GPIO_InitStructure);

    GPIO_SetBits(GPIOA, GPIO_Pin_15);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;   //sck

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init( GPIOB, &GPIO_InitStructure);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;   //miso

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_Init( GPIOB, &GPIO_InitStructure);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;   //mosi

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init( GPIOB, &GPIO_InitStructure);


    SPI_InitStructure.SPI_Direction =SPI_Direction_1Line_Tx;// 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_Hard;

    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64; //SPI_BaudRatePrescaler_64;

    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;

    SPI_InitStructure.SPI_CRCPolynomial = 7;

    SPI_Init( SPI3, &SPI_InitStructure);

    SPI_Cmd( SPI3, ENABLE);


上面是SP3配置的代码, 只要设置成SPI_NSS_HARD , spi 就不工作啦, 我用的是RTL8201F的phy, 所以智能使用SPI3,

但是没有做重映射.  PA15是 NSS, 把它设置成这个模式 GPIO_Mode_AF_PP ,SPI可以发数据,但是NSS(PA15)始终为高电平,不拉低.

咋整? 谢谢

个人信息保护,已隐藏

13910653233 


 GPIO_InitTypeDef GPIO_InitStructure = { 0 };

    SPI_InitTypeDef SPI_InitStructure = { 0 };


    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA , ENABLE);

    RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI3, ENABLE);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;   //nss

    GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;// GPIO_Mode_IPU;

    GPIO_Init( GPIOA, &GPIO_InitStructure);

    GPIO_SetBits(GPIOA, GPIO_Pin_15);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;   //sck

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init( GPIOB, &GPIO_InitStructure);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;   //miso

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_Init( GPIOB, &GPIO_InitStructure);


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;   //mosi

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init( GPIOB, &GPIO_InitStructure);


    SPI_InitStructure.SPI_Direction =SPI_Direction_1Line_Tx;// 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_Hard;

    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64; //SPI_BaudRatePrescaler_64;

    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;

    SPI_InitStructure.SPI_CRCPolynomial = 7;


    SPI_Init( SPI3, &SPI_InitStructure);

    SPI_SSOutputCmd(SPI3, DISABLE);

    SPI_Cmd( SPI3, ENABLE);

 这样也不行


image.png

这是 Debug SPI各个寄存器的值


你好,硬件片选,NSS需要接一个上拉电阻,然后 这个也要使能SPI_SSOutputCmd(SPI3, ENABLE);


你好, 上拉电阻焊上了也不起作用哦 

再说他本来就是高电平哦



image.pngNSS引脚初始化的时候为推挽复用输出  ,你配置的是推挽输出


您好, GPIO_Mode_Out_PP / GPIO_Mode_AF_PP   / GPIO_Mode_IPU 这几种都试过了 也上拉了

都不行.....

基本准备放弃了

谢谢您



您好,需要注意一下,当配置SPI为主模式且使用硬件NSS时,置MSTR位和SPE位,需要保证NSS此时已经是高。即在配置SPI设备为主设备且启用SPI之前,SSOE要置位,要调用SPI_SSOutputCmd函数且ENABLE,如下图。

image.png

image.png



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