接口/总线/驱动
1、硬件资源介绍:
2、问题描述:
在使用RT-Thread Studio生成的默认工程SPI驱动部分有笔误,导致SPI实际输出频率与配置参数不符合,主要问题点有以下部分:
1、从总线架构上可以看出,N32L40XCL的SPI外设都在APB2总线上,drive部分却把SPI2在APB1上进行分频,导致实际输出频率与参数不符。
if (spi_periph == SPI1)
{
spi_apb_clock = RCC_ClockFreq.Pclk2Freq;
}
else
{
spi_apb_clock = RCC_ClockFreq.Pclk1Freq;//这里应该也为Pclk2Freq
}
2、在配置CLKPHA的捕获边沿重复设置,导致实际输出数据出现偏移
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_DOUBLELINE_FULLDUPLEX;
SPI_InitStructure.SpiMode = SPI_MODE_MASTER;
//SPI_InitStructure.CLKPHA = SPI_CLKPHA_SECOND_EDGE; 屏蔽此处
SPI_InitStructure.NSS = SPI_NSS_SOFT;
SPI_InitStructure.CRCPoly = 7;
3、目前SPI最高频率拿到的板子实测为16.67MHz(其他分频系数下时钟稳定),对精度要求高的场景需要注意,一般情况下问题不大
全部0条评论
快来发表一下你的评论吧 !