查看: 5692|回复: 3

【SPI】LC025 SPI 接口收发完成标志位 无法检测

[复制链接]

7

主题

10

帖子

116

积分

中级工程师

Rank: 2

积分
116
发表于 2020-12-9 18:33:42 | 显示全部楼层 |阅读模式
使用 SPI2口 连接外设 , 时钟速率 主频16M , SPI时钟2 分频 。 SPI2的时钟已经打开
SPI 配置部分为  :
    SPI_SetSNNMode(SPI2,SPI_SSN_MODE_SOFTWARE);
    /* 外设工作主从模式 */
    SPI_SetSPIWorkMode(SPI2,SPI_WORK_MODE_MASTER);
    /* 总线通讯速率 */
    SPI_SetBaudrate(SPI2,SPI_BAUDRATEPRESCALER_DIV2);
    /* 数据bit方向 */
    SPI_SetBitOrder(SPI2,SPI_BIT_ORDER_MSB_FIRST);
    /* 总线数据位宽 */
    SPI_SetDataWidth(SPI2,SPI_DATAWIDTH_8BIT);
    /* 时钟相位 */
    SPI_SetClockPhase(SPI2,SPI_SPI_PHASE_1EDGE);
    /* 传输模式 双工半双工  */
    SPI_SetTransferMode(SPI2,SPI_MODE_FULL_DUPLEX);
    /* 时钟极性 */
    SPI_SetClockPolarity(SPI2,SPI_SPI_POLARITY_LOW);
    SPI_SetSSNPinMode(SPI2 ,SPI_SSN_SEND_MODE_LOW) ;
    SPI_SetSNNMode(SPI2,SPI_SSN_MODE_SOFTWARE);
    SPI_TxBuffClear(SPI2);
    SPI_RxBuffClear(SPI2);

使用SPI传输数据时 (lp 为缓冲区指针,用于存储发送数据并接收返回数据) 代码为  :

    SPI_Enable(SPI2);
    i  = SPI2->RXBUF ;

    LowCS();
        for( i = 0; i < len; i++ )
        {
                SPI2->TXBUF = *lp;
        while(SPI2->ISR & 0x3)
            __nop();
                *lp = SPI2->RXBUF;
        lp++;
        }
    HighCS();
    SPI_Disable(SPI2);


问题是  程序会卡在            while(SPI2->ISR & 0x3)             __nop();  原因是 检测不到 ISR Bit0 位 为1  , 该位始终为 0 .
  将这一句该位用BUSY 检测  :   while(SPI2->ISR & 0x10)             __nop();   可以运行下去, 但运行中概率出现 读到的值为上一次读取到的值的问题
也就是说 似乎是 还未收数据完毕 就已经执行了  *lp = SPI2->RXBUF 。  请问 是哪里有配置错误码 ?

回复

使用道具 举报

155

主题

847

帖子

4701

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4701
发表于 2020-12-10 08:35:55 | 显示全部楼层
用修改例程的方法试试。 还有就是用示波器看发出的波形。是否跟从器件 需要的波形一致
回复

使用道具 举报

155

主题

847

帖子

4701

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4701
发表于 2020-12-10 08:39:05 | 显示全部楼层
8M的波特率 也很高, 开始调试的时候用低波特率,调试成功再适当提高波特率,防止波形畸变引起的通信不成功
回复

使用道具 举报

7

主题

10

帖子

116

积分

中级工程师

Rank: 2

积分
116
 楼主| 发表于 2020-12-10 09:19:51 | 显示全部楼层
前面贴的代码  while(SPI2->ISR & 0x3)            __nop();  贴错了
应该是 while((SPI2->ISR & 0x3) != 03)           __nop();
此外 原因应该找到了 : 使用Debug模式  在运行中检查SPI2的寄存器 会有问题 , 似乎是因为  Debug模式 下会自动读取 SPI2的各个寄存器 , 这样导致 SPI2的RXBUF 寄存器 会被读取, 导致 ISR Bit0 位 被清零 。
而且如果使用 ISR的BUSY位检测收发成功  会导致 SPI 发送完毕,接受字节还未转到 RXBUF时 BUSY位 就置一了,此时读取 RXBUF 将为上一次的数据,导致出错  ,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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