UART TX_CALLBALL_SIZE问题

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
3个帖子/ 0新
最后一篇
kqtrinh.
离线
最后一次露面:3年9个月前
加入:2016-08-24 00:17
UART TX_CALLBALL_SIZE问题

嗨对话工程师,

我正在使用DSPS应用程序固件作为我的基准代码开始。
我通过UART行与外部MCU进行了通信。这款UART是在56.7kbps的波特拉特的建立。

我已经实现了两个函数来向外部MCU向外部MCU发送数据。

功能1:
- 在da powers上升,此功能从Flash读取并在此UART行下载外部MCU固件。此功能始终如一地工作100%,因为外部MCU实际上可以旋转并使用固件运行。这是代码:

//从闪存地址“地址”和“尺寸”读取QPI FWS /表格和
//将其写入QPI附加的UART频道
void user_sps_qpi_fw_upload(无符号int地址){

byte buf [2];
//从主机UI闪存程序中读取存储在闪存中的字节中的固件大小。
//固件Len是Flash中每个FW地址部分中的前两个字节
unsigned int fwlen;
if(spi_flash_read_data(buf,地址,user_flash_fwsize_hdr)== user_flash_qpi_fwsize_hdr){
fwlen =(buf [0] << 8)|buf [1];
地址+ = user_flash_qpi_fwsize_hdr;
}
无符号char data_ptr [user_flash_qpi_ci_blk_size];
//计算闪存读数的数量。每个读取的是user_flash_qpi_ci_blk_size字节
int n = fwlen / user_flash_qpi_ci_blk_size + 1;
for(int i = 0; i //从闪存中读取QPI FW。这可以是fw,degamma表,lum表
unsigned int ret = spi_flash_read_data(data_ptr,地址+ i * user_flash_qpi_ci_blk_size,
user_flash_qpi_ci_blk_size);
UART2_WRITE(data_ptr,user_flash_qpi_ci_blk_size,null);
UART2_FINISH_TRANSFERS();
}
}

- 在此函数中,我正在阅读user_flash_qpi_ci_blk_size = 256字节从闪存,写在UART2上。

功能2:
- 此功能从来自BLE线的数据读取,并在UART2总线上发送到外部MCU。以下是代码:

void user_ble_push(uint8_t * wrdata,uint16_t write_amount)
{
assert_err(wrdata!= null);
assert_err(write_amount!= 0);

bool send_flow_off = false;

//将BLE“数据”写入外围缓冲区“BLE_TO_PERIPH_BUFFER”
user_buffer_write_items(&ble_to_periph_buffer,wrdata,write_amount);

//检查缓冲区几乎已满,如果是,请发送Xoff
send_flow_off = user_check_buffer_almost_full(&ble_to_periph_buffer);

//如果必须发送Xoff,请尽快发送
if(send_flow_off){
user_send_ble_flow_ctrl(flow_off);
}
//开始传输
__disable_irq();

if(!auart_qpi_tx_callbackbusy){
UART_QPI_TX_CALLBACKBUSY = TRUE;
UART_QPI_TX_CALLBACK(UART_STATUS_INIT);
}
__enable_irq();
}

- 此功能是DSPS示例应用程序固件的一部分。我修改了它用于我们自己的应用程序。UART_QPI_TX_CALLBACK()与DSPS样本中的内容相同。下面是您参考此功能的代码:

静态void UART_QPI_TX_CALLBALL(UINT8_T RES)
{
静态UINT8_T大小= 0;
uint8_t * periph_tx_ptr = null;

//在未运行时从UART传输ISR或应用程序调用函数
开关(RES)
{
案例UART_STATUS_OK:
//获取数据和指针
size = user_periph_pull(&periph_tx_ptr,size);
休息;
案例UART_STATUS_INIT:
size = user_buffer_read_address(&ble_to_periph_buffer,&periph_tx_ptr,tx_callback_size);
休息;
默认:
assert_error(0);//错误:从未知来源调用回调
}
//如果有数据可用,请通过Periph发送数据
if(size> 0){
UART2_WRITE(Periph_tx_ptr,size,&uart_qpi_tx_callback);
返回;
}
//缓冲区中没有数据,因此回调已完成
uart_qpi_tx_callbackbusy = false;
}

现在我的问题/问题上面的两个功能::

1.在函数1中,我实际上使用了UART写入大小256字节。我知道TX FIFO大小只有16个字节。为什么和如何在我的情况下工作。我不抱怨。我只是想更好地了解它。

2.在功能2中,我的问题将超过16个字节的问题发送到外部MCU。如果我发送了16个字节或更少,MCU收到了一切。如果我发送了超过16个字节的数据包,则不会收到超过16个字节的字节。但是,如果我要一次进入UART2_WRITE()函数一行并浏览UART2_WRITE()中的UART2_THR_EMPTY_ISR(),我可以看到所有数据,数据将最终正确接收到完全的数据。这将每次都会发生。如果我进入代码,它将起作用。如果我让代码运行,每次都会失败。

请让我知道你看到了什么并向我解释了什么?

感谢您的关注,
- khai

设备:
mt_dialog.
离线
最后一次露面:2个月5天前
职员
加入:2015-06-08 11:34
嗨kqtrinh,

嗨kqtrinh,

1. FIFO有16个字节,但这并不意味着您只能一次发送16个字节,我的意思是只要您继续推动FIFO中的数据,那么UART会输出数据,您可以继续输出数据只要FIFO具有空间(如果FIFO有用于额外字节的空间,请通过UART2_TXFIFO_FURL_GETF())),如果FIFO已满,并且您继续推送数据,这意味着数据将被覆盖,显然您将被覆盖,显然您将覆盖将有遗失的字节。在UART驱动程序中,从UART2_WRITE()函数中推动前16个字节,一旦UART2_TXFIFO_FULL_GETF()返回0(在FIFO中没有更多的空间),函数将返回并等待UART FIFO以获得空,即立时由于它变为空,UART中断将点击指示空FIFO,并且在中断上下文中调用UART2_PREMPY_ISR()以重新填充FIFO。

2.关于你可以在踩通过代码时看到所有数据的事实,并且如果正常运行代码,只有16个字节,我只能假设这是因为手动和通过踩到uart fifo有时间拍摄由MCU提供的数据并将其打印出来,因此UART FIFO中总是空间(UART2_TXFIFO_FULL_GETF()函数始终是非零,所以所有打印都是从UART2_THR_EMPTY_ISR()所做的所有打印UART2_WRITE())。但是在处理器以全速运行的实际情况和调用UART2_WRITE()之后,FIFO将完整,UART2_THR_EMPTY_ISR()将返回并等到UART FIFO打印所有数据,之后,将发生UART中断,以便通知FIFO是空的,并且您可以将更多数据推入FIFO,因此UART2_Handler()将被调用并按UART2_THR_EMPTY_ISR()填写下一批16的批准字节,所以显然来自UART2_Handler的UART2_THR_EMPTY_ISR()永远不会被调用。我最信任最多可能这是你在第二种情况下获得16个字节的数据的原因,但你需要更多的调试,因为这只是一个假设,我不能忘记在这种情况下会发生什么,并且精确是什么您无法在另一边获取数据的原因。

谢谢mt_dialog.

kqtrinh.
离线
最后一次露面:3年9个月前
加入:2016-08-24 00:17
嗨MT,

嗨MT,

谢谢你通过UART2_WRITE()机制来步行。通过解释FIFO如何工作,我简单地放置了每16个字节的1毫秒等待每16个字节事务,以允许FIFO时间在再次发送接下来的16字节块之前清空其数据。这就像冠军一样。

谢谢,
- khai