前言
TLSR8258硬件SPI支持主机与从机模式,寄存器仅支持一组SPI,本章主要讲解下MSPI主机的使用,MSPI不支持DMA,如有异议,欢迎留言指正
功能管脚
- 复用引脚必须成对匹配
MOSI | MISO | SCLK | CSN |
---|---|---|---|
GPIO_PA2 | GPIO_PA3 | GPIO_PA4 | GPIO_PD6 |
GPIO_PB7 | GPIO_PB6 | GPIO_PD7 | GPIO_PD2 |
寄存器组
- SPIDAT [0x08]:SPI数据寄存器,进行读取、写入
- SPICT [0x09]:SPI控制寄存器,按位依次为
- [bit0]:主机模式下控制CSN输出
- [bit1]:使能主机模式
- [bit2]:禁用数据输出
- [bit3]:1 - 读命令 2 - 写命令
- [bit4]:地址自增
- [bit5]:共享模式
- [bit6]:忙状态
- SPISP [0x0A]:SPI主机时钟配置
SPI Clock = system clock / ((reg0x0a + 1)*2)
- SPIMODE [0x0B]:SPI工作模式配置,设置极性与相位
代码实例
驱动代码可以参考spi.c
文件
接口API
- spi_master_init(unsigned char DivClock, SPI_ModeTypeDef Mode):主机模式下配置时钟和工作模式
- spi_master_gpio_set(SPI_GPIO_GroupTypeDef PinGrp):选择复用管脚
- spi_write(unsigned char *Cmd, int CmdLen, unsigned char *Data, int DataLen, GPIO_PinTypeDef CSPin):指定寄存器写入数据,先写入命令后写入数据
- spi_read(unsigned char *Cmd, int CmdLen, unsigned char *Data, int DataLen, GPIO_PinTypeDef CSPin):指定寄存器读取数据,先写入命令后读取数据
应用例程
例程代码参考app_spi_master.c
文件
- 初始化spi主机模式
void spi_master_test_init(void)
{
//spi clock 500K, only master need set i2c clock
spi_master_init((unsigned char)(CLOCK_SYS_CLOCK_HZ/(2*500000)-1),SPI_MODE0); //主机模式 500K主频
spi_master_gpio_set(SPI_GPIO_GROUP_A2A3A4D6); //选择spi管脚映射
}
- spi master读写测试程序
#define SPI_CS_PIN GPIO_PD6
unsigned char regAddr_WriteCMD = 0x01; //从机寄存器写地址
unsigned char regAddr_ReadCMD = 0x11; //从机寄存器读地址
unsigned char spi_master_tx_buff[2] = {0x11, 0x22};//写入数据缓存
unsigned char spi_master_rx_buff[2];//读取数据缓存
void spi_master_mainloop(void)
{
spi_write(®Addr_WriteCMD, 1, (unsigned char *)spi_master_tx_buff, sizeof(spi_master_tx_buff), SPI_CS_PIN);//往寄存器0x01写入两个字节
spi_read(®Addr_ReadCMD, 1, (unsigned char *)spi_master_rx_buff, sizeof(spi_master_rx_buff), SPI_CS_PIN);//从寄存器0x11读取两个字节数据
}