【国民技术N32G457评测】 RT_Thread Studio SPI 填坑
[复制链接]
本帖最后由 lugl4313820 于 2022-2-7 19:30 编辑
上午解决了NSS不能拉低的问题:
查看了drv_spi.c的配置函数:
结合调试的数据:
发现CLKPOL为2,而我传进去的参数是:
cfg.mode = RT_SPI_MODE_MASK | RT_SPI_MODE_1 | RT_SPI_MSB ; //配置为spi主,MODE1 (CPOL=0,CPHA=1)
感觉是不是两个配合有问题:drv_spi.c的配置为:
switch(configuration->mode & RT_SPI_MODE_3)
{
case RT_SPI_MODE_0:
SPI_InitStructure.CLKPOL = SPI_CLKPOL_LOW;
SPI_InitStructure.CLKPHA = SPI_CLKPHA_FIRST_EDGE;
break;
case RT_SPI_MODE_1:
SPI_InitStructure.CLKPOL = SPI_CLKPOL_LOW;
SPI_InitStructure.CLKPHA = SPI_CLKPHA_SECOND_EDGE;
break;
case RT_SPI_MODE_2:
SPI_InitStructure.CLKPOL = SPI_CLKPOL_HIGH;
SPI_InitStructure.CLKPHA = SPI_CLKPHA_FIRST_EDGE;
break;
case RT_SPI_MODE_3:
SPI_InitStructure.CLKPOL = SPI_CLKPOL_HIGH;
SPI_InitStructure.CLKPHA = SPI_CLKPHA_SECOND_EDGE;
break;
}
是不是不能三个参数一起传进去,因为下面的配置参数直接写死了几个参数:
/*!< SPI configuration */
SPI_InitStructure.DataDirection = SPI_DIR_SINGLELINE_TX;
SPI_InitStructure.SpiMode = SPI_MODE_MASTER;
SPI_InitStructure.CLKPHA = SPI_CLKPHA_SECOND_EDGE;
SPI_InitStructure.NSS = SPI_NSS_SOFT;
SPI_InitStructure.CRCPoly = 7;
于是我改为mode配置为:
cfg.mode = RT_SPI_MODE_1 ;
下载后查看时序图为:
感觉又进了一步,spi发出的数据已经有了。
但是只发送了一位数据,而且不是我发出去的数。
翻回去看了一下,没有指定数据传顺序:
更新成:
cfg.mode = RT_SPI_MODE_1 | RT_SPI_MSB;
下载后时序图如下:
发出来的数据也对了,就是卡在FlagStatus SPI_I2S_GetStatus(SPI_Module* SPIx, uint16_t SPI_I2S_FLAG);这里。
看来还是哪里配置有问题。
再次调试发现卡在等待接收标志那里,我本来是发命令只send,没有接收的。。这。。。。
再次回去修改drv_spi.c的配置函数:
/*!< SPI configuration */
SPI_InitStructure.DataDirection = SPI_DIR_DOUBLELINE_FULLDUPLEX; //再次修改为双工
然后发送成功:
至此spi的发送已经调通:
最后总结:
1、drv_spi.c 的 configure(struct rt_spi_device* device, struct rt_spi_configuration* configuration)接收cs的结构体要设置成:
struct n32_hw_spi_cs
{
GPIO_Module* GPIOx;
uint32_t GPIO_Pin;
};
还有传入的mode参数不能加入主从模式。
只能传:
cfg.mode = RT_SPI_MODE_1 | RT_SPI_MSB;这两个参数
最后把工程上传吧,希望给要用RT_Thread Studio 使用N32G45的人有点建议。
调整传输速率为70M然测试,实际工作频率为50M为最大频率。
|