在线时间24 小时
UID2080902
注册时间2014-9-16
NXP金币0
TA的每日心情 | 开心 2024-6-14 08:06 |
---|
签到天数: 2 天 连续签到: 1 天 [LV.1]初来乍到
中级会员
 
- 积分
- 247
- 最后登录
- 2024-6-14
|
又来问关于用硬件SPI,CS用软件的问题。在K64平台上实验的,
先看用硬件cs的波形,10M波特率,传8位,一帧差不多就1us时间。
10M硬件CS
用软件cs,10M波特率,传8位,一帧要12us时间。
10M软件CS
库是用SDK_2.4.2_MK64FN1M0xxx12,相关操作代码如下
masterConfig.whichCtar = kDSPI_Ctar0;
masterConfig.ctarConfig.baudRate = TRANSFER_BAUDRATE;
masterConfig.ctarConfig.bitsPerFrame = 8U;
masterConfig.ctarConfig.cpol = kDSPI_ClockPolarityActiveHigh;
masterConfig.ctarConfig.cpha = 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 = 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);
DSPI_MasterTransferCreateHandle(EXAMPLE_DSPI_MASTER_BASEADDR, &g_m_handle, DSPI_MasterUserCallback, NULL);
while (1)
{
masterXfer.txData = masterTxData;
masterXfer.rxData = NULL;
masterXfer.dataSize = TRANSFER_SIZE;
masterXfer.configFlags = kDSPI_MasterCtar0 | kDSPI_MasterPcsContinuous|EXAMPLE_DSPI_MASTER_PCS_FOR_TRANSFER;
GPIO_PinWrite(GPIOD,11,0);
DSPI_MasterTransferNonBlocking(EXAMPLE_DSPI_MASTER_BASEADDR, &g_m_handle, &masterXfer);
while((SPI2->SR)>>SPI_SR_TCF_SHIFT &0x01U)//判断是否传输完成
{
GPIO_PinWrite(GPIOD,11,1);
SPI2->SR |=SPI_SR_TCF(0);//传输完成,清0
}
当时只觉得速度慢了点,毕竟用软件CS了,但是随之该了波特率,神奇的事情发生了。
接下来是用软件cs,用1M波特率,传8位,是传8位,但是。。。。
1M软件CS
从波形上看,是传了2针数据,可是我配置的是传8位呀。接下来在实验了,用100k的波特率,好了又发生了神奇的事情
100k软件CS
CS不输出了,软件仿真了一下,断点打在while((SPI2->SR)>>SPI_SR_TCF_SHIFT &0x01U)里面,的确是进不去了,可是再把断点打到while上,程序运行到while上,我在点运行,结果程序跑到了while里面的断点了,这就又理解不了了。
对了,SPI的配置没有变,用 了例程的,只是改了波特率与软件CS。
各位看看,是我在操作寄存器的时候少了什么步骤吗?
最佳答案
看来这个问题只有我能回答了。。。。。
首先,关于软件实现的波形为什么CS的时间为什么会比硬件自身的时间长,这个问题大家都懂,简单来说,就是你软件实现的时候先拉高了CS,再去配置SPI,然后写数据,这些都是需要 ...
|
|