1.前言
原本说写ADC,但是考虑到6已经给了串口,算了算了,还是把SPI和IIC放到7和8吧。整体用下来感觉NXP的协议比ST和TI开发的完善的,都可以走硬件,比较完善的底层开发,没有硬伤,那么接下来我们来快速上手吧。
2.初始化
首先说一下,官方的SDK是有问题的,并不是SPI问题,而是管脚布置问题。我最开始研究的这个例程,MOSI管脚死活没有输出,CLK反而有。

翻了一下管脚定义

发现是19,21两个管脚
 CLK输出正常,但是MOSI没有东西。所以我在程序里换了个管脚,我不确定是我管脚烧了还是程序问题,后面如果有人测试也可以评论区说说效果,是官方程序的问题还是芯片的问题。 
我的初始化程序如下
void init_spi0_pin(void)
{
    /* Enables clock for switch matrix.: enable */
    CLOCK_EnableClock(kCLOCK_Swm);
    /* SPI0_SCK connect to P0_18 */
    SWM_SetMovablePinSelect(SWM0, kSWM_SPI0_SCK, kSWM_PortPin_P0_18);
    /* SPI0_MOSI connect to P0_20 */
    SWM_SetMovablePinSelect(SWM0, kSWM_SPI0_MOSI, kSWM_PortPin_P0_27);
    /* SPI0_MISO connect to P0_19 */
    SWM_SetMovablePinSelect(SWM0, kSWM_SPI0_MISO, kSWM_PortPin_P0_28);
    /* SPI0_SSEL0 connect to P0_21 */
    SWM_SetMovablePinSelect(SWM0, kSWM_SPI0_SSEL0, kSWM_PortPin_P0_21);
    /* Disable clock for switch matrix. */
    CLOCK_DisableClock(kCLOCK_Swm);
}
void init_spi0(void)
{
	CLOCK_Select(kSPI0_Clk_From_MainClk);
	init_spi0_pin();
    spi_master_config_t userConfig = {0};
    SPI_MasterGetDefaultConfig(&userConfig);
    userConfig.baudRate_Bps           = 5000U;
    userConfig.sselNumber             = kSPI_Ssel0Assert;
    userConfig.clockPhase             = kSPI_ClockPhaseSecondEdge;
    userConfig.delayConfig.frameDelay = 1;
    SPI_MasterInit(SPI0, &userConfig, CLOCK_GetFreq(kCLOCK_MainClk));
} 
比较简单上面一个函数是初始化管脚就不说了。看下面的函数,首先是选择时钟,依然是主时钟,15Mhz的那个,大家应该很熟悉了,大部分外设都是这个。
![]()
接着是设置一个spi结构体用以我们的配置
![]()
然后获取默认配置
![]()
然后是通信速率,我这里是5Khz,官方给的是50Mhz,不过我看没什么问题
 然后是选择CS管脚
![]()
在芯片内部每个SPI可以有两个CS管脚,我们可以自由选择cs10,cs11或是全选

然后选择第几个时钟边沿传输数据,一般是第一个
![]()
此外NXP对于SPI还提供了延迟
  官方给出了四种延迟

(1)CS选中后到传输前的延迟(2)传输完毕后到CS恢复高电平前延迟(3)框架与框架内延迟(4)传输与传输见延迟。但是光这里设置没有用,这里的设置要配合传输时的设置一起用才行,这个我一会再说。
3.传输
程序如下
void SPI0_Senddata(void)
{
	unsigned char t[2]={5,10};
    unsigned char r[2];
    spi_transfer_t xfer = {0};
    /*Start Transfer*/
    xfer.txData      = t;
    xfer.rxData      = r;
    xfer.dataSize    = 2;
    xfer.configFlags = kSPI_EndOfFrame|kSPI_EndOfTransfer;
    /* Transfer data in polling mode. */
    SPI_MasterTransferBlocking(SPI0, &xfer);
}
 
首先申请两个区域,一块用以接收,一块用以发送,然后申请一个结构体来进行设置

然后设置传输,第一个参数是传输数据存放地址,第二个参数是接收数据存放地址,第三个参数是当前传输的数据量

最后这句就可以配合前面的设置的延迟对spi过程进行延迟
![]()
等这些配置完毕后就可以开始传输了。
指定SPI,投入刚刚配置好的结构体就可以发送了。
![]()
4.测试
首先我们测试没有延迟的情况,我在主程序里循环发送,5和10,两个数据


效果如下


因为逻辑分析仪还没到,所以这里我用示波器看了一下CLK与MOSI,可以看到波形输出正确,没有问题。
下面我们加上延迟,可以明显看到在一组数据传输完毕后,相较于上一次,可以明显看到延迟

5.结语
总的来说NXP的协议使用起来比较简单。当然,SDK里还有复杂的中断等等,但是我就不搞了,大家有需要可以自行测试。等明天逻辑分析仪到了我会再把完整的SPI信号发给大家看。












![[Python] 什么是集成算法,什么是随机森林?随机森林分类器(RandomForestClassifier)及其使用案例](https://img-blog.csdnimg.cn/direct/79e713806e64427fb4c30aa40850d423.png)






