来回好几天,终于把SPI通讯的测试通过:
一、测试的思路:spi1做发送,spi2做接收。发送32位数据,接收到后判断是否正确。
二、接线:
SPI1 NSS (PA4) —— SPI2 NSS(PB12)
SPI1 SCK (PA5) —— SPI2 SCK (PB13)
SPI1 MISO(PA6) —— SPI2 MOSI(PB15)
SPI1 MOSI(PA7) —— SPI2 MISO(PB14)备注:交叉接
三、初始化时钟:
1、初始化spi总线时钟为RCC_HCLK_DIV2;
2、使能APB2的GPIO、SPI的时钟;
3、使能APB1的GPIO时钟。
四、初始化GPIO:
1、将主spi的SCK、MOSI配置为高速输出。
2、将从SPI的SCK配置为输入,MISO配置为输入模式。
五、中断配置:
使能SPI1、SPI2的中断。同时在n32g45x_it.c中新建SPI1_IRQHandler、SPI2_IRQHandler函数,用于发送与接收。
六、配置串口1,用于输入结果。
七、配置SPI1、SPI2:
/* SPI_MASTER configuration ------------------------------------------------*/
SPI_InitStructure.DataDirection = SPI_DIR_SINGLELINE_TX; //单向的数据模式
SPI_InitStructure.SpiMode = SPI_MODE_MASTER; //主
SPI_InitStructure.DataLen = SPI_DATA_SIZE_8BITS; //设置SPI的数据大小:SPI发送接收8位帧结构
SPI_InitStructure.CLKPOL = SPI_CLKPOL_LOW; //串行同步时钟的空闲状态为低电平
SPI_InitStructure.CLKPHA = SPI_CLKPHA_SECOND_EDGE; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
SPI_InitStructure.NSS = SPI_NSS_HARD; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
SPI_InitStructure.BaudRatePres = SPI_BR_PRESCALER_256; //定义波特率预分频的值:波特率预分频值为256
SPI_InitStructure.FirstBit = SPI_FB_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
SPI_InitStructure.CRCPoly = 7; //CRC值计算的多项式
SPI_Init(SPI_MASTER, &SPI_InitStructure);
/* SPI_SLAVE configuration -------------------------------------------------*/
SPI_InitStructure.DataDirection = SPI_DIR_SINGLELINE_RX;
SPI_InitStructure.SpiMode = SPI_MODE_SLAVE;
SPI_Init(SPI_SLAVE, &SPI_InitStructure);
SPI_SSOutputEnable(SPI_MASTER, ENABLE); //硬件管理NSS管脚,要使能这个参数
/* Enable SPI_MASTER TXE interrupt */
SPI_I2S_EnableInt(SPI_MASTER, SPI_I2S_INT_TE, ENABLE);
/* Enable SPI_SLAVE RXNE interrupt */
SPI_I2S_EnableInt(SPI_SLAVE, SPI_I2S_INT_RNE, ENABLE);
/* Enable SPI_SLAVE */
SPI_Enable(SPI_SLAVE, ENABLE);
/* Enable SPI_MASTER */
SPI_Enable(SPI_MASTER, ENABLE);
八、测试方法:
1、先禁止传输中断,把数据拷到发送缓存数组,清空接收数组,再开启传输中断。
2、核对收发的数组内存,如果是一至则打印出PASS。
九、测试结果:
十、遇到的问题:
原来我在官方提供的例子上测试,但是总有些时候接收到的是乱码,起先是怀疑是不是我的杜邦线有问题,或者是接触不好,于是换了线等等都是效果不好,最后我改写到while里面来测试才能通过。建议官方写例子最好自己也测试通过一下。免得象我多花了好些时间。还有就是DMA的测试也不是很成功。
十一、下一步测试打算
用RT_Thread Studio来做测试的DEMO。
|