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信号发给大家看。