中科蓝讯之 SPI 的基本运用

本篇博文要介绍的是中科蓝讯平台下 SPI 的相关运用,通常我们的标准 SPI 为四线 (CLK、CS、MOSI、MISO),当然也有三线 (CLK、MOSI、MISO)、两线 (CLK、DIO),这就取决于我们实际需要调试的设备通讯模式。下面介绍的是把蓝讯芯片,用作 SPI 主机进行相关配置的方法步骤。

第一步就是先确定 SPI 设备的通讯模式是哪种,然后再对要用到的 SPI Group 对应的 IO 进行初始化。我们可以通过查阅芯片的 Datasheet 来确定当前 IO 是否能配置为 SPI 通讯脚以及是属于哪一路 SPI Group。例如下图中的 PE7、PE6、PE5,这一组 IO 同属于 Group4,分别是用作于 SPI1DO、 SPI1CLK、SPI1DI 三条通讯线。




接下来是配置系统的主频以及 SPI 的通讯波特率,蓝讯平台下的主频以及 SPI 的波特率配置关系式如下:

            Baud Rate = Fsys clock / (SPI_BAUD + 1)

所以需要特别注意的是: SPI 的波特率最高不能超过系统主频;

             SPI_BAUD = Fsys clock / Baud Rate – 1

在做 SPI 初始化时,波特率需要根据主频来进行整数倍的配置。例如:系统主频是80M,SPI 设备通讯速率要求是 40M,那么上述公式中的对应关系应为:Fsys clock = 80000000;Baud Rate = 40000000;SPI_BAUD = 1。

芯片支持的所有系统主频频率一般是定义在 api_sysclk.h 函数中。


再接下来就是进行相应的寄存器配置,包括 SPIEN 使能位、FUNCMCON Group 配置位、BUSMODE 数据线模式位等,其它寄存器按默认值,在 SPI 初始化时,配置寄存器即可。下面三个函数分别是 SPI 延时函数,SPI 单 byte 接收函数,SPI 单 byte 发送函数,我们可以根据不同的设备的数据发送格式,合理运用这些函数。如果是多从机设备,还需要先获取各从设备的 flash id,用于在多设备做通讯切换的判断。

///SPIFlash Delay

AT(.text.spiflash1_drv)
static void spi1_delay(void)
{
uint cnt = 20;
while (cnt--) {
asm("nop");
}
}

///SPI接口获取1Byte数据
AT(.text.spiflash1_drv)
static u8 spi1_getbyte(void)
{
SPI1CON |= BIT(4); //RX
SPI1BUF = 0xff;
while (!(SPI1CON & BIT(16))); //Wait pending
return SPI1BUF;
}

///SPI接口发送1Byte数据
AT(.text.spiflash1_drv)
static void spi1_sendbyte(u8 data)
{
SPI1CON &= ~BIT(4); //TX
SPI1BUF = data;
while (!(SPI1CON & BIT(16))); //Wait pending
}


以上就是一个蓝讯平台上的软件模拟 SPI 的一个基本运用流程,不同系列的芯片可能会有一些小差异,不过整体运用思路就是这样,在实际运用过程中,可以通过串口调试或者波形抓取的手段来验证我们的软件是否正常通讯。更多类型的 SPI运用我们后续再补充,本篇博文内容到此结束,欢迎大家一起进行留言沟通探讨,谢谢大家!

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论