目的:
通过CSM32RV20开发平台,使用硬件SPI接口与Si24R1进行通信,通信成功后,通过串口打印数据。
实现过程:
1.中断向量表和系统时钟初始化
在IDE里新建项目后,都会包含CLIC_Init()和System_Clock_Init()两个函数。中断向量表初始化,系统中断初始化,用户无需关心。系统时钟初始化函数中,可以方便的选中时钟源、时钟分频系数、外设时钟使能和RC频率选择。
int main(void)
{
///----System Init ---------------------------------------------------------------------------------------------
CLIC_Init();//中断向量表初始化
System_Clock_Init();//系统时钟初始化
void System_Clock_Init(void)//系统时钟初始化
{
//时钟源开关
CMU->SRC_EN = 1<<1 //RCOSC bit[1]:0-off, 1-on
|1<<0; //crystal bit[0]:0-off, 1-on
//外设和内核时钟来源选择
CMU->CLK_SEL = 1<<2 //phripheral bit[3:2]:0-RCOSC, 1-crystal, 2-LSI(3K), 3-reserved
|1<<0; //cpu bit[1:0]:0-RCOSC, 1-crystal, 2-LSI(3K), 3-reserved
//设置时钟分频系数
CMU->CLK_DIV = 0<<10 //RTC bit[14:10]:0-2, 1-2, 2-2, 3-2, 4-4, 5-4, 6-6, 7-6 ......
|0<<5 //phripheral bit[9:5]:0-1, 1-1, 2-2, 3-3, 4-4, 5-5,......31-31
|0<<0; //CPU bit[9:5]:0-1, 1-1, 2-2, 3-3, 4-4, 5-5,......31-31
//外设时钟使能
CMU->PER_EN = 1; //bit[0]:0-off, 1-on
//RC频率选择
CMU_RC_DEFAULT->RC_DEFAULT = 0; //bit[0]:0-16MHz, 1-32MHz
}
2.外设初始化
2.1外设初始化(串口)
串口初始化:选中UART1,UART1即可以用作烧录使用(开发板串口默认使用UART1),又可以调用打印,方便数据输出。UART1:PA6:TX1,复用配置AF0(默认)。PA5:RX1,复用配置AF0(默认)。
UART_Init_case1(UART1); //串口初始化
由于开发板上使用的晶振为32MHz,那么我们设置0x0116<<8串口波特率就是115200
UARTx->CTRL = 0<<25 //接收中断使能: 0-off,1-on
|0<<24 //发送中断使能:0-off,1-on
|0x0116<<8 //波特率(对应16M时钟):
//0x1a0b-2400,0x0683-9600,0x0341-19200,0x0116-57600,0x008b-115200
//0x0045-230400,0x0023-460800,0x0011-921600,0x000d-1128800
|1<<6 //模式选择:0-模式0,1-模式1,2/3-模式2
|0<<5 //多处理器使能
|1<<4 //接收使能
|0<<3 //发送数据bit8
|0<<2; //接收数据bit8
2.2外设初始化(SPI)
SPI初始化,选中非中断模式。Si24R1采用四线制SPI,与MCU连接共6根线。Si24R1芯片引脚介绍(MOSI和MISO直接与MCU的硬件SPI对应连接即可,即MOSI与SPI1_MOSI连接)。CE,芯片开启信号,激活 RX 或 TX 模式。CSN,SPI 片选信号。SCK,SPI 时钟信号。MOSI,SPI 输入信号。MISO,SPI输出信号。IRQ,可屏蔽中断信号(可以通过0x00寄存器CONFIG配置屏蔽),低电平有效。
SPI_Init_case1(SPI1); //SPI初始化,非中断模式
CSM32RV20,硬件SPI1引脚说明:PA2-SPI1_SCK,PA3-SPI1_MISO,PA4_SPI1_MOSI.
if(SPIx==SPI1)
{
//用户自选CSN,软件操作片选信号
//配置SCK
GPIO_MODE_Init(GPIOA, PIN2, GPIO_MODE_AF); //PA2复用模式
GPIO_AF_Init(GPIOA, PIN2, GPIO_AF0); //PA2复用到SPI1_SCK
//配置MISO
GPIO_MODE_Init(GPIOA, PIN3, GPIO_MODE_AF);