查看: 2497|回复: 6

[MQX] 在mqx下,调试spi-dataflash所遇到的问题?

[复制链接]

该用户从未签到

51

主题

307

帖子

0

高级会员

Rank: 4

积分
651
最后登录
2020-9-4
发表于 2015-10-19 15:36:03 | 显示全部楼层 |阅读模式
我使用的芯片是K64系列,利用mqx系统下的函数对dataflash读写数据。
当我写入528字节数据时,程序会处于 红字处。任务处于等待EVENT_IO_FINISHED。
我将DSPI_FIFO_DEPTH = 4;改为DSPI_FIFO_DEPTH = 2;程序可以正常运行。
哪位大侠帮解答一下。
static _mqx_int _dspi_tx_rx
    (
        /* [IN] Device specific context structure */
        void                          *io_info_ptr,
        /* [IN] Data to transmit */
        uint8_t                     *txbuf,
        /* [OUT] Received data */
        uint8_t                     *rxbuf,
        /* [IN] Length of transfer in bytes */
        uint32_t                        len
    )
{
    DSPI_INFO_STRUCT_PTR               dspi_info_ptr = (DSPI_INFO_STRUCT_PTR)io_info_ptr;
    VDSPI_REG_STRUCT_PTR               dspi_ptr = dspi_info_ptr->DSPI_PTR;
    uint32_t                            tx_len;
    uint32_t                            rx_len;
    uint32_t                            data;
    bool                            use_isr;
    uint32_t                        i;
    use_isr = dspi_info_ptr->NUM_VECTORS && dspi_info_ptr->ATTR & DSPI_ATTR_USE_ISR;
    data = dspi_info_ptr->DUMMY_PATTERN;
    /* Is frame larger than a single byte? */
    if (DSPI_CTAR_FMSZ_GET(dspi_ptr->CTAR[0]) > 7)
    {
        len = len & (~1UL);
        rx_len = tx_len = len/2;
        while (rx_len)
        {
            if (tx_len) {
                if ((dspi_ptr->SR & DSPI_SR_TFFF_MASK) && ((rx_len-tx_len)<DSPI_FIFO_DEPTH))
                {
                    if (txbuf)
                    {
                        data = *txbuf++;
                        data = (data << 8) | *txbuf++;
                    }
                    dspi_ptr->PUSHR = DSPI_PUSHR_TXDATA(data);
                    dspi_ptr->SR = DSPI_SR_TFFF_MASK;
                    tx_len--;
                }
                else if (use_isr)
                {
                    /* do not wait for RX data in a loop, break it and use ISR */
                    break;
                }
            }
            
            if (dspi_ptr->SR & DSPI_SR_RFDF_MASK)
            {
                data = DSPI_POPR_RXDATA_GET(dspi_ptr->POPR);
                dspi_ptr->SR = DSPI_SR_RFDF_MASK;
                if (rxbuf)
                {
                    *rxbuf++ = data >> 8;
                    *rxbuf++ = data & 0xff;
                }
                rx_len--;
            }
            else if (tx_len == 0 && use_isr)
            {
                /* do not wait for RX data in a loop, break it and use ISR */
                break;
            }
        }
    }
    else
    {
        rx_len = tx_len = len;
        /* Optimized loop for single byte frames */
        while (rx_len)
        {
            if (tx_len) {
                if ((dspi_ptr->SR & DSPI_SR_TFFF_MASK) && ((rx_len-tx_len)<DSPI_FIFO_DEPTH))
               
                {
                    if (txbuf)
                        data = *txbuf++;
                    dspi_ptr->PUSHR = DSPI_PUSHR_TXDATA(data);
                    dspi_ptr->SR = DSPI_SR_TFFF_MASK;
                    tx_len--;
                }
                else if (use_isr)
                {
                    /* do not wait for RX data in a loop, break it and use ISR */
                    break;
                }
            }

            if (dspi_ptr->SR & DSPI_SR_RFDF_MASK)
            {
                if (rxbuf)
                    *rxbuf++ = DSPI_POPR_RXDATA_GET(dspi_ptr->POPR);
                else
                    dspi_ptr->POPR; /* dummy read to drain FIFO */
                dspi_ptr->SR = DSPI_SR_RFDF_MASK;
                rx_len--;
            }
            else if (tx_len == 0 && use_isr)
            {
                /* do not wait for RX data in a loop, break it and use ISR */
                break;
            }
        }
    }
    if (rx_len)
    {
        /* finish the transfer using ISR */
        dspi_info_ptr->TX_BUF = txbuf;
        dspi_info_ptr->TX_LEN = tx_len;
        dspi_info_ptr->RX_BUF = rxbuf;
        dspi_info_ptr->RX_LEN = rx_len;
        /* enable interrupt and wait for ISR state machine to finish the job */
        dspi_ptr->RSER = DSPI_RSER_RFDF_RE_MASK;
        _lwsem_wait(&dspi_info_ptr->EVENT_IO_FINISHED);
    }
    return len;
}

我知道答案 目前已有6人回答
回复

使用道具 举报

  • TA的每日心情
    开心
    2024-1-6 07:38
  • 签到天数: 736 天

    连续签到: 1 天

    [LV.9]以坛为家II

    21

    主题

    3486

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    5093
    最后登录
    2024-1-7
    发表于 2015-10-20 08:59:48 | 显示全部楼层
    帮顶一下
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    该用户从未签到

    51

    主题

    307

    帖子

    0

    高级会员

    Rank: 4

    积分
    651
    最后登录
    2020-9-4
     楼主| 发表于 2015-10-20 09:38:32 | 显示全部楼层

    自己顶一下
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    51

    主题

    307

    帖子

    0

    高级会员

    Rank: 4

    积分
    651
    最后登录
    2020-9-4
     楼主| 发表于 2015-10-20 09:40:21 | 显示全部楼层
    自顶一下
    回复

    使用道具 举报

    该用户从未签到

    145

    主题

    4926

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9267
    最后登录
    1970-1-1
    发表于 2015-10-20 14:02:41 | 显示全部楼层
    楼主你好,你的问题已经帮你转给我们的MQX工程师,他有空会帮你解答,还请耐心等待下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    51

    主题

    307

    帖子

    0

    高级会员

    Rank: 4

    积分
    651
    最后登录
    2020-9-4
     楼主| 发表于 2015-10-20 16:14:53 | 显示全部楼层
    FSL_TICS_ZJJ 发表于 2015-10-20 14:02
    楼主你好,你的问题已经帮你转给我们的MQX工程师,他有空会帮你解答,还请耐心等待下。 ...

    多谢版主!耐心等待。。。。。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    51

    主题

    307

    帖子

    0

    高级会员

    Rank: 4

    积分
    651
    最后登录
    2020-9-4
     楼主| 发表于 2015-10-21 09:36:20 | 显示全部楼层
    顶一下!
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-22 10:23 , Processed in 0.102102 second(s), 27 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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