RT1176 LPSPI驱动移植到RT-THREAD
步骤一 :引脚配置
思路:由底层往上逐层配置
- 先在MCUXpresso Config Tools上配置好SPI的引脚,分别是
- 将fsl_lpspi.c添加构建
- 将drv_spi.c添加构建
- 将rt-thread/components/drivers/spi目录下的 spi_core.c添加构建
步骤二:RTT的配置
RTT有两处地方要配置
第一处
文件配置完成后,对 board/Kconfig进行修改,
drv_spi.c中默认有4路SPI,SPI有三种模式:阻塞,中断,DMA
先使用阻塞的模式
以下是Kconfig的代码
menuconfig BSP_USING_SPI
bool "Enable SPI"
select RT_USING_SPI
default y
if BSP_USING_SPI
config BSP_USING_SPI1
bool "Enable SPI1"
default n
config BSP_SPI1_USING_DMA
bool "Enable SPI1 DMA"
depends on BSP_USING_SPI1
select BSP_USING_DMA
select RT_SPI_USING_DMA
default n
config BSP_SPI1_TX_DMA_CHANNEL
depends on BSP_SPI1_USING_DMA
int "Set SPI1 TX DMA channel (0-32)"
default 0
config BSP_SPI1_RX_DMA_CHANNEL
depends on BSP_SPI1_USING_DMA
int "Set SPI1 RX DMA channel (0-32)"
default 1
config BSP_USING_SPI2
bool "Enable SPI2"
default n
config BSP_SPI2_USING_DMA
bool "Enable SPI2 DMA"
depends on BSP_USING_SPI2
select BSP_USING_DMA
select RT_SPI_USING_DMA
default n
config BSP_SPI2_TX_DMA_CHANNEL
depends on BSP_SPI2_USING_DMA
int "Set SPI2 TX DMA channel (0-32)"
default 2
config BSP_SPI2_RX_DMA_CHANNEL
depends on BSP_SPI2_USING_DMA
int "Set SPI2 RX DMA channel (0-32)"
default 3
config BSP_USING_SPI3
bool "Enable SPI3"
default n
config BSP_SPI3_TX_USING_DMA
bool "Enable SPI3 TX DMA"
depends on BSP_USING_SPI3
select BSP_USING_DMA
select RT_SPI_USING_DMA
default n
config BSP_SPI3_TX_DMA_CHANNEL
depends on BSP_SPI3_TX_USING_DMA
int "Set SPI3 TX DMA channel (0-32)"
default 0
config BSP_SPI3_RX_USING_DMA
bool "Enable SPI3 RX DMA"
depends on BSP_USING_SPI3
select BSP_USING_DMA
select RT_SPI_USING_DMA
default n
config BSP_SPI3_RX_DMA_CHANNEL
depends on BSP_SPI3_RX_USING_DMA
int "Set SPI3 RX DMA channel (0-32)"
default 1
config BSP_USING_SPI4
bool "Enable SPI4"
default n
config BSP_SPI4_TX_USING_DMA
bool "Enable SPI4 TX DMA"
depends on BSP_USING_SPI4
select BSP_USING_DMA
select RT_SPI_USING_DMA
default n
config BSP_SPI4_TX_DMA_CHANNEL
depends on BSP_SPI4_TX_USING_DMA
int "Set SPI4 TX DMA channel (0-32)"
default 0
config BSP_SPI4_RX_USING_DMA
bool "Enable SPI4 RX DMA"
depends on BSP_USING_SPI4
select BSP_USING_DMA
select RT_SPI_USING_DMA
default n
config BSP_SPI4_RX_DMA_CHANNEL
depends on BSP_SPI4_RX_USING_DMA
int "Set SPI4 RX DMA channel (0-32)"
default 1
endif
endmenu
第二处
步骤三 设备的初始化
step1 将设备挂载到总线上
按照RTT框架对SPI进行挂载
首先要区分RTT中 SPI设备,和SPI总线的区别
在console中分别是 SPI device 和 SPI bus
SPI BUS不需要额外初始化,RTT已经帮你做好了
但SPI device需要自己挂载,因为 device 可以不止一个,可以有 spi11 spi12 等
比如下面的代码,就是将spi10设备挂载到 spi1总线上
ret = rt_hw_spi_device_attach("spi1","spi10",pin_EVB_SPI1_CS);
step2 对设备进行设置
设置SPI的波特率,主从,MSB或LSB,数据宽度等
比如下面的代码,另外可以将该函数,用 INIT_DEVICE_EXPORT 添加到初始化段中,
到时RTT就会自己调用了
struct rt_spi_configuration cfg;
cfg.data_width = 8;
cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB;
cfg.max_hz = 12000000U;//12*1000*1000;//50 * 1000 *1000; /* 20M */
struct rt_spi_device *SPI1_EVB;
SPI1_EVB = (struct rt_spi_device *)rt_device_find("spi10"); /*要用rt_device_find获取 spi10的句柄*/
rt_spi_configure(SPI1_EVB, &cfg);
步骤四 :数据的发送
同样需要先找到设备的句柄,然后设置数据,最后调用 rt_spi_transfer_message()
需要注意的是,
- 这里的 length指的数据的字节数(非位数)
- 如果recv_buf 为 NULL,RTT会自动设置成 TX ONLY模式,会对SPI的寄存器中的RXMASK赋值为1
struct rt_spi_device *SPI1_Dev;
SPI1_Dev = (struct rt_spi_device *)rt_device_find("spi10");
if (!SPI1_Dev)
{
rt_kprintf("can't find %s device!\n", SPI_BUSNAME_HC165);
}
else
{
struct rt_spi_message msg;
uint8_t Tx_Buffer[8] = {0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa};
uint8_t Rx_Buffer[8];
msg.send_buf = Tx_Buffer;
msg.recv_buf = RT_NULL;//&Rx_Buffer;
msg.length = 8;
msg.cs_take = 1;
msg.cs_release = 1;
msg.next = RT_NULL;
rt_spi_transfer_message(SPI1_Dev, &msg);
}
上机效果
BSP的运行结果
SDK的运行结果
Debug思路
首先确认RTT配置的代码有无问题:
同样的应用代码,在STM32F767上运行,波形正常
所以排除是应用代码的问题
接下来确认是不是 fsl