【国民技术N32G457评测】SPI收发评测
<p>来回好几天,终于把SPI通讯的测试通过:</p><p>一、测试的思路:spi1做发送,spi2做接收。发送32位数据,接收到后判断是否正确。</p>
<p>二、接线: </p>
<p>SPI1 NSS (PA4) —— SPI2 NSS(PB12)</p>
<p>SPI1 SCK (PA5) —— SPI2 SCK (PB13)</p>
<p>SPI1 MISO(PA6) —— SPI2 MOSI(PB15)</p>
<p><span style="background-color:#f39c12;">SPI1 MOSI(PA7) —— SPI2 MISO(PB14)备注:交叉接</span></p>
<p>三、初始化时钟:</p>
<p>1、初始化spi总线时钟为RCC_HCLK_DIV2;</p>
<p>2、使能APB2的GPIO、SPI的时钟;</p>
<p>3、使能APB1的GPIO时钟。</p>
<p>四、初始化GPIO:</p>
<p>1、将主spi的SCK、MOSI配置为高速输出。</p>
<p>2、将从SPI的SCK配置为输入,MISO配置为输入模式。</p>
<p>五、中断配置:</p>
<p>使能SPI1、SPI2的中断。同时在n32g45x_it.c中新建SPI1_IRQHandler、SPI2_IRQHandler函数,用于发送与接收。</p>
<p>六、配置串口1,用于输入结果。</p>
<p>七、配置SPI1、SPI2:</p>
<pre>
<code> /* 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);</code></pre>
<p>八、测试方法:</p>
<p>1、先禁止传输中断,把数据拷到发送缓存数组,清空接收数组,再开启传输中断。</p>
<p>2、核对收发的数组内存,如果是一至则打印出PASS。</p>
<p>九、测试结果:</p>
<p> 十、遇到的问题:</p>
<p>原来我在官方提供的例子上测试,但是总有些时候接收到的是乱码,起先是怀疑是不是我的杜邦线有问题,或者是接触不好,于是换了线等等都是效果不好,最后我改写到while里面来测试才能通过。建议官方写例子最好自己也测试通过一下。免得象我多花了好些时间。还有就是DMA的测试也不是很成功。</p>
<p>十一、下一步测试打算</p>
<p>用RT_Thread Studio来做测试的DEMO。</p>
<p> </p>
<p> </p>
<p>SPI时钟是多少MHz?</p> 本帖最后由 lugl4313820 于 2022-2-7 07:42 编辑
<div class="quote">
<blockquote><font size="2"><a href="forum.php?mod=redirect&goto=findpost&pid=3120240&ptid=1193300" target="_blank"><font color="#999999">littleshrimp 发表于 2022-2-7 00:32</font></a></font> SPI时钟是多少MHz?</blockquote>
</div>
<p>总线36M、256分频:</p>
<p>/* PCLK2 = HCLK/2 */<br />
SPI_InitStructure.BaudRatePres = SPI_BR_PRESCALER_256; //定义波特率预分频的值:波特率预分频值为256 RCC_ConfigPclk2(RCC_HCLK_DIV2);</p>
<p>有什么软件可以配置底层函数的吗</p>
页:
[1]