本帖最后由 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;
}
|