SPI配置
使用SPI2
SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线,用于主控和外挂芯片之间的通信
四根通信线:SCK(Serial Clock 串行时钟线 别称:SCLK CLK CK)、MOSI(Master Output Slave Input 主机输出从机输入 别称:DO Data Output)、MISO(Master Input Slave Output 主机输入从机输出 DI Data Input)、SS(Slave Select 从机选择 别称:NSS Not Slave Select 、 CS Chip Select)
同步,全双工
SCK引脚,用来提供时钟信号,数据位的输出和输入,都是在SCK的上升沿和下降沿进行的,这样,数据位的收发时可就可以明确的确定。
全双工,就是数据发送和数据接收单独各占一条线,发送用发送的线路,接收用接收的线路,两者互不影响。MOSI和MISO,就是分别用于发送和接收的两条线路,MOSI,是主机输出从机输入,如果是主机接在这条线上,那就是MO,主机输出,如果是从机接在这条线上,就是SI,从机输入,意思就是一条通信线,如果主机接在上面配置为输出,那从机肯定得配置为输入,才能接收主机的数据,主机和从机不能同时配置为输出或输入,要不然就没法通信了,所以这条MOSI,就是主机向从机发送数据的线路,同理下面这条MISO,就是主机从从机接收数据的线路。
支持总线挂载多设备(一主多从)
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOB时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);//使能SPI2时钟,在APB1时钟里面
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_15|GPIO_Pin_14;
//PB13-15分别复用为SCK,MISO,MOSI
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
//GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_15|GPIO_Pin_14);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_SPI2);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_SPI2);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_SPI2);
//RCC_APB2PeriphResetCmd(RCC_APB1Periph_SPI2,ENABLE);//复位SPI1
//RCC_APB2PeriphResetCmd(RCC_APB1Periph_SPI2,DISABLE);//停止复位SPI1
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //SPI设置为双线双向全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置为主SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //SPI发送接收8位帧结构
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //时钟悬空低
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //数据捕获于第二个时钟沿
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由软件(使用SSI位)管理
//SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定义波特率预分频的值:波特率预分频值为256
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; //定义波特率预分频的值:波特率预分频值为256
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //数据传输从MSB位开始
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式
SPI_Init(SPI2, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
SPI_Cmd(SPI2, ENABLE); //使能SPI外设
SPI2_WK_ReadWriteByte(0xff);//启动传输
SPI2速度设置
设置为10M时钟,高速模式
assert_param(IS_SPI_BAUDRATE_PRESCALER(SpeedSet));//判断有效性
SPI2->CR1&=0XFFC7;//位3-5清零,用来设置波特率
SPI2->CR1|=SpeedSet; //设置SPI2速度
SPI_Cmd(SPI2,ENABLE); //使能SPI2
SPI片选初始化,以及wk复位脚初始化
片选PB9,wk2124复位脚PB4
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); //使能PB端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_4; //PB12端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //IO口速度为100MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB12
GPIO_SetBits(GPIOB,GPIO_Pin_9); //PB12 输出高
中断初始化
使用PB3脚做wk2124中断
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIO时钟
//GPIOB.3 中断线以及中断初始化配置 下降沿触发
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB,GPIO_PinSource3);
EXTI_InitStructure.EXTI_Line=EXTI_Line3;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; //使能按键KEY2所在的外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2,
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //子优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure);
wk2124驱动
请参考官方给的文件,在此不再赘述
main函数
void EXTI3_IRQHandler(void)
{
printf("IN EXTI3_IRQ!!!!\n");
if(EXTI_GetFlagStatus(EXTI_Line3)!= RESET){
EXTI_ClearITPendingBit(EXTI_Line3); //清除LINE1上的中断标志位
irq_flag=1;
printf("IN EXTI3_IRQ over! !!!\n");
}
}
void delay_us(uint32_t delay_us)
{
volatile unsigned int num;
volatile unsigned int t;
for (num = 0; num < delay_us; num++)
{
t = 11;
while (t != 0)
{
t--;
}
}
}
//毫秒级的延时
void delay_wk_ms(uint16_t delay_ms)
{
volatile unsigned int num;
for (num = 0; num < delay_ms; num++)
{
delay_us(1000);
}
}
int main(void)
{
unsigned char dat1;
uint8_t dat_test,dat_test1,err1 = 0,err = 0,i = 0;
uint8_t prot = 1, prot1 = 2,rev_len = 0;
unsigned char data1[10] = {'a','1','b','c','f','9','h','e','l','l'};
//unsigned char data1[10] = {1,2,3,3,4,7,7,6,6,9};
unsigned char rev_data[256] = {0};
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_printf_init(115200);//printf初始化
ff_hal_ntc_init();//ADC初始化
WK_SPI_Init();
GPIO_SetBits(GPIOB,GPIO_Pin_4);
delay_wk_ms(50);
GPIO_ResetBits(GPIOB,GPIO_Pin_4);
delay_wk_ms(10);
GPIO_SetBits(GPIOB,GPIO_Pin_4);
delay_wk_ms(10);
Wk2124_RstInit();
/*读写GNEA,测试主接口通信是否成功*/
dat1=WkReadGReg(WK2XXX_GENA);
delay_wk_ms(1000);
printf("gena=0x%x.\n",dat1);
WK2124_all_init(prot);
WK2124_all_init(prot1);
dat1=WkReadGReg(WK2XXX_GENA);
delay_wk_ms(200);
printf("gena=0x%x.\n",dat1);
WK2124SetBaud(prot,115200);
WK2124SetBaud(prot1,115200);
EXTIX_WK_Init();
WK2124SendBuf(1,(unsigned char *)"Distance Stop\r\n", strlen("Distance Stop\r\n"));
rev_len=WK2124ReadReg(1,WK2XXX_RFCNT);
WK2124ReadFifo(1,rev_data,strlen("Distance Stop\r\n"));
printf("revicie: %s send :%s ,rev_len:%d\n",rev_data,(unsigned char *)"Distance Stop\r\n" , rev_len);
}