在线时间285 小时
UID3419421
注册时间2017-8-30
NXP金币0
该用户从未签到
高级会员
- 积分
- 750
- 最后登录
- 2021-1-25
|
在看SDK_2.2_LPC54608J512\boards\lpcxpresso54608\driver_examples\spi\interrupt_b2b_transfer\master\mdk\spi_interrupt_b2b_transfer_master这个例子不是很理解,其中的 SPI_MasterTransferNonBlocking(EXAMPLE_SPI_MASTER, &handle, &xfer)这个函数
主函数大致功能是开发板上的SPI作为master,另外一块板子作为slave。中断方式发送和接收。将srcbuff发到slave,然后slave发送相同的内容到master,比较后看是否一致。其中主函数主要调用了两个函数:
1.SPI_MasterTransferCreateHandle(EXAMPLE_SPI_MASTER, &handle, masterCallback, NULL)
该函数注册回调函数的
2. SPI_MasterTransferNonBlocking(EXAMPLE_SPI_MASTER, &handle, &xfer);
该函数是进行发送和接收的。但是我单步运行的时候,没看到该函数是如何与底层寄存器FIFOWR 和FIFORD赋值调用的?
/* Init Buffer */
for (i = 0; i <BUFFER_SIZE; i++)
{
srcBuff[i] = i;
}
/* Send to slave */
xfer.txData = srcBuff;
xfer.rxData = destBuff;
xfer.dataSize = sizeof(destBuff);
xfer.configFlags = kSPI_FrameAssert;
SPI_MasterTransferCreateHandle(EXAMPLE_SPI_MASTER, &handle, masterCallback, NULL);
SPI_MasterTransferNonBlocking(EXAMPLE_SPI_MASTER, &handle, &xfer);
while (masterFinished != true)
{
}
/* Check if the data is right */
for (i = 0; i < BUFFER_SIZE; i++)
{
if (srcBuff[i] != destBuff[i])
{
err++;
PRINTF("The %d is wrong! data is %d\n\r", i, destBuff[i]);
}
}
if (err == 0)
{
PRINTF("Succeed!\n\r");
}
SPI_MasterTransferNonBlocking函数的定义如下:
status_t SPI_MasterTransferNonBlocking(SPI_Type *base, spi_master_handle_t *handle, spi_transfer_t *xfer)
{
/* check params */
assert(
!((NULL == base) || (NULL == handle) || (NULL == xfer) || ((NULL == xfer->txData) && (NULL == xfer->rxData))));
if ((NULL == base) || (NULL == handle) || (NULL == xfer) || ((NULL == xfer->txData) && (NULL == xfer->rxData)))
{
return kStatus_InvalidArgument;
}
/* dataSize (in bytes) is not aligned to 16bit (2B) transfer */
assert(!((handle->dataWidth > kSPI_Data8Bits) && (xfer->dataSize & 0x1)));
if ((handle->dataWidth > kSPI_Data8Bits) && (xfer->dataSize & 0x1))
{
return kStatus_InvalidArgument;
}
/* Check if SPI is busy */
if (handle->state == kStatus_SPI_Busy)
{
return kStatus_SPI_Busy;
}
/* Set the handle information */
handle->txData = xfer->txData;
handle->rxData = xfer->rxData;
/* set count */
handle->txRemainingBytes = xfer->txData ? xfer->dataSize : 0;
handle->rxRemainingBytes = xfer->rxData ? xfer->dataSize : 0;
handle->totalByteCount = xfer->dataSize;
/* other options */
handle->toReceiveCount = 0;
handle->configFlags = xfer->configFlags;
/* Set the SPI state to busy */
handle->state = kStatus_SPI_Busy;
/* clear FIFOs when transfer starts */
base->FIFOCFG |= SPI_FIFOCFG_EMPTYTX_MASK | SPI_FIFOCFG_EMPTYRX_MASK;
base->FIFOSTAT |= SPI_FIFOSTAT_TXERR_MASK | SPI_FIFOSTAT_RXERR_MASK;
/* enable generating txIRQ and rxIRQ, first transfer is fired by empty txFIFO */
base->FIFOINTENSET |= SPI_FIFOINTENSET_TXLVL_MASK | SPI_FIFOINTENSET_RXLVL_MASK;
return kStatus_Success;
}
根据函数里写的,数据txdata和rxdata是赋值给了 handle->txData和 handle->rxData,这个就不知道如何与底层寄存器关联了???
最佳答案
本帖最后由 okwh 于 2017-11-30 11:16 编辑
继续找, 寄存器它们都在\devices\LPC54114\LPC54114_cm4.h 如 SPI_Type; SPI0~7_Base
寄存器它们在base, 设置、状态、数据进一 ...
|
|