LPC804开发(8.SPI使用)

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

 然后是选择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里还有复杂的中断等等,但是我就不搞了,大家有需要可以自行测试。

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值