查看: 2274|回复: 3

[已解决] LPC54608 SPI 例程不理解,求指导

[复制链接]

该用户从未签到

61

主题

233

帖子

7

高级会员

Rank: 4

积分
750
最后登录
2021-1-25
发表于 2017-11-28 10:47:43 | 显示全部楼层 |阅读模式
在看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, 设置、状态、数据进一 ...
回复

使用道具 举报

  • TA的每日心情
    擦汗
    2021-7-5 15:45
  • 签到天数: 664 天

    [LV.9]以坛为家II

    42

    主题

    1594

    帖子

    19

    金牌会员

    Rank: 6Rank: 6

    积分
    5388
    最后登录
    2021-12-22
    发表于 2017-11-28 17:44:27 | 显示全部楼层
    底层寄存器, 需要去看底层驱动代码,不只是看例子代码。
    比如devices目录下
    SDK_2.2_LPC54608J512\boards\lpcxpresso54608\devices\LPC54608\drivers下的
    fsl_spiXXXX.c ,  fsl_spiXXXX.h

    评分

    参与人数 1 +1 收起 理由
    NXP管管 + 1

    查看全部评分

    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    61

    主题

    233

    帖子

    7

    高级会员

    Rank: 4

    积分
    750
    最后登录
    2021-1-25
     楼主| 发表于 2017-11-30 10:08:12 | 显示全部楼层
    okwh 发表于 2017-11-28 17:44
    底层寄存器, 需要去看底层驱动代码,不只是看例子代码。
    比如devices目录下
    SDK_2.2_LPC54608J512\boards ...

    SPI_MasterTransferNonBlocking函数就是fsl_spi.c里面的,但是我单步运行这个函数的时候,没跟踪到如何跟底层寄存器挂钩的
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2021-7-5 15:45
  • 签到天数: 664 天

    [LV.9]以坛为家II

    42

    主题

    1594

    帖子

    19

    金牌会员

    Rank: 6Rank: 6

    积分
    5388
    最后登录
    2021-12-22
    发表于 2017-11-30 10:48:04 | 显示全部楼层
    本帖最后由 okwh 于 2017-11-30 11:16 编辑

    继续找, 寄存器它们都在\devices\LPC54114\LPC54114_cm4.h   如  SPI_Type;  SPI0~7_Base

    寄存器它们在base, 设置、状态、数据进一步和 handle  、 xfer  之间转来转去
    厂商驱动为了处理中断、FIFO、用户回调等,比较啰嗦,设置了base, handle  、 xfer这样三层互动的结构。

    base->FIFOWR   base->FIFORD就是寄存器。

    NonBlocking函数只判断标志,真正的传送在Blocking函数
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-5-4 09:38 , Processed in 0.122083 second(s), 25 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表