4471|7

6960

帖子

11

TA的资源

版主

楼主
 

【沁恒RISC-V内核 CH582】BUG串口一次最多只能接收8个字节 [复制链接]

 

最近用串口接收串口屏的数据,一次只能接收8个字节:

串口按常规配置:

   GPIOB_SetBits( GPIO_Pin_7);
   GPIOB_ModeCfg( GPIO_Pin_4, GPIO_ModeIN_PU );      // RXD-配置上拉输入
   GPIOB_ModeCfg( GPIO_Pin_7, GPIO_ModeOut_PP_5mA );    // TXD-配置推挽输出,注意先让IO口输出高电平
   UART0_DefInit();

串口接收用查询方式:

while(R8_UART0_LSR & RB_LSR_DATA_RDY == 0x01){
            SerialStr0.RecvBuff[i] = R8_UART0_RBR;
            PRINT("%02X",SerialStr0.RecvBuff[i]);
            i++;
        }
或者用:
/*********************************************************************
 * @fn      UART0_RecvString
 *
 * [url=home.php?mod=space&uid=159083]@brief[/url] 串口读取多字节
 *
 * @param   buf     - 读取数据存放缓存区首地址
 *
 * [url=home.php?mod=space&uid=784970]@return[/url] 读取数据长度
 */
uint16_t UART0_RecvString(uint8_t *buf)
{
    uint16_t len = 0;

    while(R8_UART0_RFC)
    {
        *buf++ = R8_UART0_RBR;
        len++;
    }

    return (len);
}

这两种方式,都是一次只能接收到8个字节

试验如下图:

 希望官方出来说说如何一次性接收8位数据以上。

还有就是如果用中断的方式:

如果配置为UART_7BYTE_TRIG,     // 7字节触发,那么如果刚好接收到8位数据,那空闲中断就不会触发。

 

最新回复

这边建议你先用我贴出来的代码 你先让项目好用再说哈,然后在研究为什么你只能收到8个字节的数据就停止的问题。   详情 回复 发表于 2022-4-9 11:13
点赞 关注
 
 

回复
举报

293

帖子

0

TA的资源

一粒金砂(高级)

沙发
 
/********************************** (C) COPYRIGHT *******************************
 * File Name          : Main.c
 * Author             : WCH
 * Version            : V1.0
 * Date               : 2020/08/06
 * Description 		    : 串口0收发演示
 *******************************************************************************/

#include "CH58x_common.h"

UINT8 TxBuff[] = "This is a tx exam\r\n";
UINT8 RxBuff[100];
UINT8 trigB;

int main()
{
  UINT8 len;

  SetSysClock( CLK_SOURCE_PLL_60MHz );

  /* 配置串口0:先配置IO口模式,再配置串口 */

  GPIOB_SetBits( GPIO_Pin_7);
  GPIOB_ModeCfg( GPIO_Pin_4, GPIO_ModeIN_PU );      // RXD-配置上拉输入
  GPIOB_ModeCfg( GPIO_Pin_7, GPIO_ModeOut_PP_5mA );    // TXD-配置推挽输出,注意先让IO口输出高电平
  UART0_DefInit();

  UART0_SendString( TxBuff, sizeof( TxBuff ) );

#if 1       // 查询方式:接收数据后发送出去
    while( 1 )
    {
      len = UART0_RecvString( RxBuff );
      if ( len )
      {
        UART0_SendString( RxBuff, len );
      }
    }
#endif

#if 0      // 中断方式:接收数据后发送出去
  UART1_ByteTrigCfg( UART_7BYTE_TRIG );
  trigB = 7;
  UART1_INTCfg( ENABLE, RB_IER_RECV_RDY|RB_IER_LINE_STAT );
  PFIC_EnableIRQ( UART1_IRQn );
#endif    

  while( 1 )
    ;
}

看了一下你的问题,我用官方提供的demo跑了一下,是用的是uart1 是好用的,然后我改成uart0也是好使的。不知道你怎么操作导致的只能接收8位。现在我将把我修改好的demo分享给你

 
 
 

回复

293

帖子

0

TA的资源

一粒金砂(高级)

板凳
 

 

这是我用串口助手测试的结果,收发不限制的

 

点评

你可以试一下用他的例程。 #if 1 // 中断方式:接收数据后发送出去 UART1_ByteTrigCfg( UART_7BYTE_TRIG ); trigB = 7; UART1_INTCfg( ENABLE, RB_IER_RECV_RDY|RB_IER_LINE_STAT ); PFIC_E  详情 回复 发表于 2022-4-8 16:43
 
 
 

回复

1万

帖子

139

TA的资源

版主

4
 

决不可能是硬件bug,是你的软件有问题。

点评

可以发给你帮忙看看是什么问题吗?我反正是试出有问题,也不可能无中生有。  详情 回复 发表于 2022-4-8 16:30
个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
 
 
 

回复

6960

帖子

11

TA的资源

版主

5
 
chunyang 发表于 2022-4-8 14:35 决不可能是硬件bug,是你的软件有问题。

可以发给你帮忙看看是什么问题吗?我反正是试出有问题,也不可能无中生有。

 
 
 

回复

6960

帖子

11

TA的资源

版主

6
 
yangjiaxu 发表于 2022-4-8 12:06   这是我用串口助手测试的结果,收发不限制的  

你可以试一下用他的例程。


#if 1      // 中断方式:接收数据后发送出去
  UART1_ByteTrigCfg( UART_7BYTE_TRIG );
  trigB = 7;
  UART1_INTCfg( ENABLE, RB_IER_RECV_RDY|RB_IER_LINE_STAT );
  PFIC_EnableIRQ( UART1_IRQn );
#endif    

__INTERRUPT
__HIGH_CODE
void UART1_IRQHandler( void )
{
  UINT8V i;

  switch ( UART1_GetITFlag() )
  {
    case UART_II_LINE_STAT :        // 线路状态错误
    {
      UART1_GetLinSTA();
      break;
    }

    case UART_II_RECV_RDY :          // 数据达到设置触发点
      for ( i = 0; i != trigB; i++ )
      {
        RxBuff[i] = UART1_RecvByte();
        //UART1_SendByte( RxBuff[i] );  这里如果设置接收8个数据为触发
      }
      break;

    case UART_II_RECV_TOUT :         // 接收超时,暂时一帧数据接收完成  //按照其他的单片机的中断触发是接收超时就会产生中断的。但是如果发过来的数据刚好是8个字节,那么这个中断就不会产生,网友们可以试一下。
      i = UART1_RecvString( RxBuff );
      //UART1_SendString( RxBuff, i );  
      break;

    case UART_II_THR_EMPTY :         // 发送缓存区空,可继续发送
      break;

    case UART_II_MODEM_CHG :         // 只支持串口0
      break;

    default :
      break;
  }

}

用这个例子,来用来判断不定长的接收。如果接收到的数据刚好是设置一帧数时,接收超时中断就不会被触发,而自己要去设置一个超时函数来判断。但是STM32等他们的单片机,都会产生接收超时中断的。大家可以试验一下:发刚好发送8个字节,接收超时中断就不会触发。

点评

这边建议你先用我贴出来的代码 你先让项目好用再说哈,然后在研究为什么你只能收到8个字节的数据就停止的问题。  详情 回复 发表于 2022-4-9 11:13
 
 
 

回复

293

帖子

0

TA的资源

一粒金砂(高级)

7
 
lugl4313820 发表于 2022-4-8 16:43 你可以试一下用他的例程。 #if 1 // 中断方式:接收数据后发送出去 UART1_ByteTrigCfg( U ...

这边建议你先用我贴出来的代码 你先让项目好用再说哈,然后在研究为什么你只能收到8个字节的数据就停止的问题。

点评

非常感谢,项目已经弄好了,只是我感觉有这个问题,我目前是采用接收1个数据就产生中断去接收,然后用定时器来判断超时,只不过感还要用个定时去判断,浪费资源而已。  详情 回复 发表于 2022-4-9 11:33
 
 
 

回复

6960

帖子

11

TA的资源

版主

8
 
yangjiaxu 发表于 2022-4-9 11:13 这边建议你先用我贴出来的代码 你先让项目好用再说哈,然后在研究为什么你只能收到8个字节的数据就停止的 ...

非常感谢,项目已经弄好了,只是我感觉有这个问题,我目前是采用接收1个数据就产生中断去接收,然后用定时器来判断超时,只不过感还要用个定时去判断,浪费资源而已。

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
天线 基本概念

完全天线手册基本概念--------------------------------------------------------------------------------天线是FMDX的耳朵,微 ...

电感器、变压器检测方法与经验

三、电感器、变压器检测方法与经验??1?色码电感器的的检测??将万用表置于R×1挡,红、黑表笔各接色码电感器的任一引出端,此时指 ...

实现第二步: 自己DIY一个廉价的C8051编程器并成功读写湿度计开发板

昨天用洞洞板按照我前面帖子提供的图纸焊接出一个并口C8051编程器。 今天一早插到PC机上,运行编程器文件(前面帖子附件可下 ...

留住身边的美景,2015年春天

本帖最后由 mmmllb 于 2015-4-9 12:28 编辑 不知道说现在是春天是否合适:Sweat:,先这么叫着。 话说最近各路的花都开了,有 ...

7660贴片共模电感生产厂家

7660贴片共模电感生产厂家 东莞颐特电子有限公司是一家专门设计生产各种贴片电感、线圈的制造 ...

颁奖:Microchip有奖问答 | 新品 MCU 独立于内核的外设(CIP)技术解密

【活动详情】Microchip有奖问答 | 新品 MCU 独立于内核的外设(CIP)技术解密 请获奖者务必在2021年9月26日23:59前,按照 ...

GD32L233C-START 开发板 学习笔记(四)

GD32L233C-START 开发板学习笔记(四) GD32L23C-START 开发板 Demo例程 打开GD的例程,有没有满满的熟悉感。 int main ...

异常与中断缘何设计的如此复杂——《RISC-V体系结构编程与实践 》读书笔记

本帖最后由 jobszheng5 于 2023-5-11 15:13 编辑 在ARM公司的RISC指令集Cortex-M3系列MCU中,异常与中断的实现与处理非常简 ...

英飞凌XENSIV™ PAS CO2 5V Sensor2Go套件测评(一)

本帖最后由 eew_4FmF97 于 2024-12-16 01:14 编辑 根据采集各种的环境的数据,形成感知,从而为AI提供决策依据,是智能家居系 ...

求助大佬们

本帖最后由 wang1213322d 于 2025-1-10 16:56 编辑 用了Vishay的环境光传感器VEML33293做了个模块,给电视上应用,客户要求我 ...

关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表