GD32F190的 SPI主模式无法输出NSS信号
spi_parameter_struct spi_init_struct;gpio_af_set(GPIOA, GPIO_AF_0, GPIO_PIN_15);
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_15);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15);
/* SPI0 parameter config */
spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
spi_init_struct.device_mode = SPI_MASTER;
spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT;
spi_init_struct.clock_polarity_phase = SPI_CK_PL_HIGH_PH_2EDGE;
spi_init_struct.nss = SPI_NSS_SOFT;
spi_init_struct.prescale = SPI_PSC_8;
spi_init_struct.endian = SPI_ENDIAN_MSB;
spi_init(SPI0, &spi_init_struct);
数据发送和接收都是正常的,但是就是没有NSS信号发出,电路上肯定没问题的,因为原来是STM32F0的板子,只是换了GD32F190上去,我使用PA15做NSS输出,也有配置PA15到AF0,外部有上拉10K电阻,但是芯片工作后NSS始终被拉低,郁闷,有大神支招不? 配置参数 SPI_NSS_SOFT 指定通过软件发出NSS,需要修改 zzyybb22 发表于 2018-4-27 10:32
配置参数 SPI_NSS_SOFT 指定通过软件发出NSS,需要修改
gpio_af_set(GPIOA, GPIO_AF_0, GPIO_PIN_15);
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_15);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15);
SPI_CTL0(SPI0)&= ~SPI_CTL0_SPIEN; //----Disable SPI
SPI_CTL0(SPI0)=(uint32_t)(
(0 << 15) | //--0=两线单向--1=单线双向
(0 << 14) | //--0=单线双向只接收--1=单线双向只发送
(0 << 13) | //--0=CRC计算禁止--1=CRC计算使能
(0 << 12) | //--0=下一发送值来自发送寄存器--1=下一发送值来自CRC寄存器
(1 << 11) | //--0=8位帧长度--1=16位帧长度
(0 << 10) | //--0=两线单向全双工--1=两线单向只接收不发送
(0 <<9) | //--SSM0=NSS脚从硬件管理--1=起用SSI从软件管理
(1 <<8) | //--SSI当SSM位为1时,此位值决定了NSS引脚电平
(0 <<7) | //--0=先发送MSB--1=先发送LSB
(0 <<6) | //--0=禁止SPI设备--1=开启SPI设备
(4 <<3) | //--(0-7)波特率控制,为PCLK的分频倍数(2,4,8,16,32,64,128,256)
(1 <<2) | //--0=配置为从设备--1=主设备
(0 <<1) | //--时钟极性
(0 <<0)); //--时钟相位
SPI_CTL1(SPI0)=(uint32_t)(
(0 <<7) | //--0=TBE中断屏蔽--1=TBE中断不屏蔽
(0 <<6) | //--0=RBNE中断屏蔽--1=RBNE中断不屏蔽
(0 <<5) | //--0=错误中断屏蔽--1=错误中断不屏蔽
(1 <<2) | //--0=主模式下SS输出禁用--1=起用
(0 <<1) | //--0=TX的DMA缓冲禁止--1=启用
(0 <<0)); //--0=RX的DMA缓冲禁止--1=启用
//SPI_STAT(SPI0) //----状态寄存器
//SPI_DATA(SPI0) //----数据寄存器
//SPI_CRCPOLY(SPI0) //----CRC多项式
//SPI_RCRC(SPI0) //----接收CRC计算结果
//SPI_TCRC(SPI0) //----发射CRC计算结果
SPI_I2SCTL(SPI0)=0;
//SPI_I2SPSC(SPI0)
//SPI_QCTL(SPI0)
SPI_CTL0(SPI0)|=SPI_CTL0_SPIEN; //----Enable SPI
//NVIC_SetPriority(SPI0_IRQn,1);
//NVIC_EnableIRQ(SPI0_IRQn);
重新改写了SPI0的初始化函数,效果一样(数据发送和接收正常,就是NSS信号一直被拉低),请帮忙检查和指正一下问题。谢谢! 咋没人关注我的问题呢? 我也没法用硬件NSS,使用软件操作NSS就好了。 静听风易 发表于 2018-4-28 15:28
我也没法用硬件NSS,使用软件操作NSS就好了。
就是没搞懂是为什么,估计是哪里设置没对,GD32的手册说的太简单,反复看了几遍手册还是没明白哪里有问题。 这个是将STM32的项目迁移到GD的,原打算节前迁移完成,现在只有停下先了,郁闷。 刚刚测试了SPI1
B12---->NSS
B13---->SCK
B14---->MISO
B15---->MOSI
还是一样的现象,数据收发正常,但就是没有硬件NSS信号发出。 该管脚自身的内部下拉电阻的是怎样设置的? 还有该管教室外部是不有下拉电阻设计的? vivilzb1985 发表于 2018-4-28 22:51
还有该管教室外部是不有下拉电阻设计的?
内部设置推挽输出,外部悬空测量的。 都没人关注! 这个NSS信号的不要的也可以的吧 先看下该管脚的是否又被其他模块调用的 /*!
\brief SPI NSS output enable
\paramspi_periph: SPIx(x=0,1,2)
\param none
\retval none
*/
void spi_nss_output_enable(uint32_t spi_periph)
{
SPI_CTL1(spi_periph) |= (uint32_t)SPI_CTL1_NSSDRV;
}
NSS输出使能。
此外 :
主机硬件NSS 模式:为NSS 输出,NSSDRV=1 时,为单主机模
式,NSSDRV=0 时,为多主机模式。
从机硬件NSS 模式:为NSS 输入,作为从机的片选信号。 SPI总线的设计还是非常不错的 关于SPI总线的设计还是比较难的 反正我还是没搞定,现在还是只能手控NSS。当然我也没去搞了。 NSS输出使能后,当SPI使能时,如果NSS引脚配置为输出模式,NSS引脚在主模式时被拉低。也就是NSS脚在SPI使能后一直是低电平 确实垃圾 GD32E230也一样 NSS脚一直为低
页:
[1]
2