打印

FX3 CyU3PUartReceiveBytes API详解 (新手入门手册)

[复制链接]
3398|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zengweitotty|  楼主 | 2015-12-15 13:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TE, API, UART, ce, ST
本帖最后由 zengweitotty 于 2015-12-15 13:35 编辑

新手入门的系列文档【原创】
本贴讲解了API的使用方法和源代码分析。
如下是API的声明部分。
uint32_t
CyU3PUartReceiveBytes (
       uint8_t             *data_p,     //接收数据的头指针
       uint32_t             count,      //接收数据的字节数
       CyU3PReturnStatus_t *status)     //返回接收是否成功的状态
1.参数检查:
     如果uartblock未使用API CyU3PUartSetConfig进行配置,将会返回status=CY_U3P_ERROR_NOT_CONFIGURED,同时返回读取到0个字节数据。
     如果uart block配置为DMA模式,将会返回status=CY_U3P_ERROR_NOT_CONFIGURED, 同时返回读取到0个字节数据。
     如果data_p 没有合理分配使用空间,将会返回status=CY_U3P_ERROR_NULL_POINTER, 同时返回读取到0个字节数据。
     如果count==0,将会返回status=CY_U3P_ERROR_BAD_ARGUMENT, 同时返回读取到0个字节数据。
     如果uart 没有通过API CyU3PUartInit配置,或者不是在线程空间操作此函数,或者系统相关的错误导致API CyU3PUartReceiveBytes 获取不到互斥量glUartLock(查看threadx user guide),将会返回status 为相应的错误代号, 同时返回读取到0个字节数据。
2.从RX fifo中读取RX data。
      设置glUartReadTimeout,如果你未通过APICyU3PUartSetTimeout配置timeout参数,则glUartReadTimeout为0xfffff。
       判断RX fifo中是否有数据接收到,同时检查是否timeout,如果RXfifo中有数据,则拷贝到data_p(CyU3PUartReceiveBytes第二个参数)。如果产生了timeout错误,将会返回staut= CY_U3P_ERROR_TIMEOUT,同时函数返回实际接收到的数据量。
       通过API CyU3PUartReleaseLock()释放互斥量glUartLock,同时更新status参数,函数返回实际接收到的数据量。
函数源代码说明:
uint32_t
CyU3PUartReceiveBytes (
       uint8_t             *data_p,     //接收数据的头指针
       uint32_t             count,      //接收数据的字节数
       CyU3PReturnStatus_t *status)     //返回接收是否成功的状态
{
    uint32_t timeout;      //timeout的数值
    int32_t i;
    CyU3PReturnStatus_t temp = CY_U3P_SUCCESS;

   /*No need to acquire lock during status checks. */
   if(!glIsUartConfigured)      //如果uart未通过CyU3PUartSetConfig API进行配置
   {
       temp= CY_U3P_ERROR_NOT_CONFIGURED;
   }
   if (glIsUartDma) //如果uart配置为DMA模式
   {
       temp = CY_U3P_ERROR_NOT_CONFIGURED;
   }
   if (data_p == NULL)    //data_p未分配空间
   {
       temp = CY_U3P_ERROR_NULL_POINTER;
   }
   if (count == 0)  //读取数据为0长度
   {
       temp = CY_U3P_ERROR_BAD_ARGUMENT;
   }

   if (temp != CY_U3P_SUCCESS)
   {
       if (status != NULL)
       {
            *status = temp; //返回读取数据量为0status为出错信息。
       }
       return 0;
   }

   temp = CyU3PUartGetLock (); //获取互斥量glUartLock
   if (temp != CY_U3P_SUCCESS)
   {
       if (status != NULL)
       {
            *status = temp;       //返回读取数据量为0status为出错信息。
       }

       return 0;
   }

   temp    = CY_U3P_SUCCESS;

timeout =glUartReadTimeout;  //通过CyU3PUartSetTimeout API配置,或者为 (0xFFFFF)


   for (i = 0; i <count; i++)
{


判断UART_STATUS寄存器中RX_DATA的位是否为1,即是否有数据在RXfifo中。如果没有数据,则timeout计数。直到timeout==0,返回CY_U3P_ERROR_TIMEOUT否则读取UART_INGRESS_DATA寄存器中的uart数据。

       /*Wait for data inside the rx fifo */
       while (((UART->lpp_uart_status &CY_U3P_LPP_UART_RX_DATA) == 0) && (timeout != 0))
       {
            timeout--;
       }

       if (timeout == 0)
       {
            temp = CY_U3P_ERROR_TIMEOUT;
            break;
       }

       data_p = ((uint8_t)(UART->lpp_uart_ingress_data));
   }
//释放互斥量。
   CyU3PUartReleaseLock();

   if (status != NULL)
   {
       *status = temp;
   }
//返回读取到的数据量。
   return i;
}


评分
参与人数 1威望 +3 收起 理由
wsjc1999 + 3 很给力!
沙发
boy1990| | 2015-12-15 15:32 | 只看该作者
temp= CY_U3P_ERROR_NOT_CONFIGURED??这个具体干嘛用的啊?

使用特权

评论回复
板凳
zengweitotty|  楼主 | 2015-12-16 10:16 | 只看该作者
boy1990 发表于 2015-12-15 15:32
temp= CY_U3P_ERROR_NOT_CONFIGURED??这个具体干嘛用的啊?

返回出错信息,通过*status参数返回。
(temp=CY_U3P_ERROR_NOT_CONFIGURED) != CY_U3P_SUCCESS
将会执行如下代码
   if (temp != CY_U3P_SUCCESS)
   {
       if (status != NULL)
       {
            *status = temp; //返回读取数据量为0,status为出错信息。
       }
       return 0;
   }

使用特权

评论回复
地板
boy1990| | 2015-12-27 19:16 | 只看该作者
zengweitotty 发表于 2015-12-16 10:16
返回出错信息,通过*status参数返回。
(temp=CY_U3P_ERROR_NOT_CONFIGURED) != CY_U3P_SUCCESS
将会执行 ...

返回出错信息,通过*status参数返回。
了解了,多谢啦!!

使用特权

评论回复
5
winkle.zhang| | 2016-2-23 09:28 | 只看该作者
本帖最后由 winkle.zhang 于 2016-2-23 10:39 编辑

我用这个函数CyU3PUartReceiveBytes()只能接收到4byte;
我的应用是:串口配制成regmode,
当接收到bRequest == 0x81时去读串口,此时调用CyU3PUartReceiveBytes 只能收到4BYTE, 同时用示波器在UART引脚上观察有完整的数据流(>4byte),
研究了好久不知怎么回事,请帮忙赐教。非常感谢。

编辑:应用是使用bulk传输视频流,使用uart传输控制数据。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

61

帖子

19

粉丝