本帖最后由 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; //返回读取数据量为0,status为出错信息。
       }
       return 0;
   }
 
   temp = CyU3PUartGetLock (); //获取互斥量glUartLock
   if (temp != CY_U3P_SUCCESS)
   {
       if (status != NULL)
       {
            *status = temp;       //返回读取数据量为0,status为出错信息。
       }
 
       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;
}
 
 |