lugl4313820 发表于 2022-2-6 17:15

【国民技术N32G457评测】SPI收发评测

<p>来回好几天,终于把SPI通讯的测试通过:</p>

<p>一、测试的思路:spi1做发送,spi2做接收。发送32位数据,接收到后判断是否正确。</p>

<p>二、接线:&nbsp; &nbsp;</p>

<p>SPI1 NSS&nbsp; (PA4) &mdash;&mdash; SPI2 NSS(PB12)</p>

<p>SPI1 SCK&nbsp; (PA5) &mdash;&mdash; SPI2 SCK&nbsp;(PB13)</p>

<p>SPI1 MISO(PA6) &mdash;&mdash; SPI2 MOSI(PB15)</p>

<p><span style="background-color:#f39c12;">SPI1 MOSI(PA7) &mdash;&mdash; 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, &amp;SPI_InitStructure);

    /* SPI_SLAVE configuration -------------------------------------------------*/
    SPI_InitStructure.DataDirection = SPI_DIR_SINGLELINE_RX;
    SPI_InitStructure.SpiMode       = SPI_MODE_SLAVE;
    SPI_Init(SPI_SLAVE, &amp;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>&nbsp; 十、遇到的问题:</p>

<p>原来我在官方提供的例子上测试,但是总有些时候接收到的是乱码,起先是怀疑是不是我的杜邦线有问题,或者是接触不好,于是换了线等等都是效果不好,最后我改写到while里面来测试才能通过。建议官方写例子最好自己也测试通过一下。免得象我多花了好些时间。还有就是DMA的测试也不是很成功。</p>

<p>十一、下一步测试打算</p>

<p>用RT_Thread Studio来做测试的DEMO。</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

littleshrimp 发表于 2022-2-7 00:32

<p>SPI时钟是多少MHz?</p>

lugl4313820 发表于 2022-2-7 07:36

本帖最后由 lugl4313820 于 2022-2-7 07:42 编辑

<div class="quote">
<blockquote><font size="2"><a href="forum.php?mod=redirect&amp;goto=findpost&amp;pid=3120240&amp;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 &nbsp;= SPI_BR_PRESCALER_256; &nbsp; &nbsp; //定义波特率预分频的值:波特率预分频值为256&nbsp;&nbsp;RCC_ConfigPclk2(RCC_HCLK_DIV2);</p>

Jeeny_李 发表于 2022-12-5 11:06

<p>有什么软件可以配置底层函数的吗</p>
页: [1]
查看完整版本: 【国民技术N32G457评测】SPI收发评测