LPC804开发(7.SPI使用)

1.前言

原本说写ADC,但是考虑到6已经给了串口,算了算了,还是把SPI和IIC放到7和8吧。整体用下来感觉NXP的协议比ST和TI开发的完善的,都可以走硬件,比较完善的底层开发,没有硬伤,那么接下来我们来快速上手吧。

2.初始化

首先说一下,官方的SDK是有问题的,并不是SPI问题,而是管脚布置问题。我最开始研究的这个例程,MOSI管脚死活没有输出,CLK反而有。

LPC804开发(7.SPI使用)_第1张图片

翻了一下管脚定义

发现是19,21两个管脚

LPC804开发(7.SPI使用)_第2张图片 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

 然后是选择CS管脚

在芯片内部每个SPI可以有两个CS管脚,我们可以自由选择cs10,cs11或是全选

LPC804开发(7.SPI使用)_第3张图片

然后选择第几个时钟边沿传输数据,一般是第一个

此外NXP对于SPI还提供了延迟

  官方给出了四种延迟

LPC804开发(7.SPI使用)_第4张图片

(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,两个数据

LPC804开发(7.SPI使用)_第5张图片

LPC804开发(7.SPI使用)_第6张图片

效果如下

LPC804开发(7.SPI使用)_第7张图片

LPC804开发(7.SPI使用)_第8张图片

因为逻辑分析仪还没到,所以这里我用示波器看了一下CLK与MOSI,可以看到波形输出正确,没有问题。

下面我们加上延迟,可以明显看到在一组数据传输完毕后,相较于上一次,可以明显看到延迟

LPC804开发(7.SPI使用)_第9张图片

这是逻辑分析仪解析到的数据,可以看到没有问题

LPC804开发(7.SPI使用)_第10张图片 

5.结语

总的来说NXP的协议使用起来比较简单。当然,SDK里还有复杂的中断等等,但是我就不搞了,大家有需要可以自行测试。

你可能感兴趣的:(LPC804,单片机)