|
[经验] FRDM-KW41Z SPI调试中遇到的奇怪时钟问题
[复制链接]
本帖最后由 yang_alex 于 2017-7-24 21:33 编辑
有幸拿到了FRDM-KW41Z板子,准备做智能时钟。既然是智能时钟,肯定是要有显示界面的了。不过FRDM-KW41Z板子引脚不多,所以选择了SPI接口的LCD。这种SPI接口的LCD,我在其他项目中也用过,很好用。
收到板子后,直接开整。接线,移植代码。。。。。。
结果发现LCD没些显示,把LCD屏换到以前项目,验证LCD屏是好的。那就是代码移植的问题了。查代码。。。。。。。
主要是SPI部分(不同厂家代码都不同,即使都是ARM),看来看去还是没头绪,老办法,用示波器看看总线波形,结果问题看出来了,SPI的数据时钟应该是8位的,怎么变成16位的了!!!另外时钟相位也不对啊!不过问题总算是定位到SPI设置上了,范围缩小,着重查SPI初始化!
正确的长这样
结果发现自己画蛇添足,想当然地修改了一个参数,导致SPI时钟出现异常。赶紧找DEMO程序改过来。哈哈!久违的界面终于出现了。
- dspi_transfer_t masterXfer;
- DSPI_MasterTransferCreateHandle(SPI1, &dspi_g_m_handle, NULL, NULL);//bound the DMA handle to SPI1
- /* Master config */
- masterConfig.whichCtar = kDSPI_Ctar0;//kDSPI_Ctar1 XXXXX
- masterConfig.ctarConfig.baudRate = TRANSFER_BAUDRATE;
- masterConfig.ctarConfig.bitsPerFrame = 8U;
- masterConfig.ctarConfig.cpol = kDSPI_ClockPolarityActiveLow;//kDSPI_ClockPolarityActiveHigh;
- masterConfig.ctarConfig.cpha = kDSPI_ClockPhaseSecondEdge; //kDSPI_ClockPhaseFirstEdge;
- masterConfig.ctarConfig.direction = kDSPI_MsbFirst;
- masterConfig.ctarConfig.pcsToSckDelayInNanoSec = 1000000000U / TRANSFER_BAUDRATE;
- masterConfig.ctarConfig.lastSckToPcsDelayInNanoSec = 1000000000U / TRANSFER_BAUDRATE;
- masterConfig.ctarConfig.betweenTransferDelayInNanoSec = 1000000000U / TRANSFER_BAUDRATE;
- masterConfig.whichPcs = kDSPI_Pcs0;//EXAMPLE_DSPI_MASTER_PCS_FOR_INIT;
- masterConfig.pcsActiveHighOrLow = kDSPI_PcsActiveLow;
- masterConfig.enableContinuousSCK = false;
- masterConfig.enableRxFifoOverWrite = false;
- masterConfig.enableModifiedTimingFormat = false;
- masterConfig.samplePoint = kDSPI_SckToSin0Clock;
- srcClock_Hz = DSPI_MASTER_CLK_FREQ;
- DSPI_MasterInit(EXAMPLE_DSPI_MASTER_BASEADDR, &masterConfig, srcClock_Hz);
复制代码
就是这一行,Demo程序用的是SPI0,我的SPI LCD用的是SPI1,想当然的改成了kDSPI_Ctar1。这错犯的太低级了。
masterConfig.whichCtar = kDSPI_Ctar0;//kDSPI_Ctar1 XXXXX
|
|