大家好、
我尝试使用 TM4C123G LaunchPad 作为示波器、与主机侧的应用进行通信。 为了能够测量不同的电压范围、我们开发了一个 BoosterPack、允许我们这样做。 在通过 USB 发送测量数据之前、我需要对其进行准备、因为主机端有一些通信法规。
我的目标是使用 ADC0实现一个通道的采样率至少为500kHz。 我在乒乓模式下配置了一个 DMA 通道来连续采样 ADC 数据。 准备数据所需的时间大约是两个 ADC 中断之间经历的时间的1/4。 剩余的时间(理论上)应该足够大,以摆脱准备好的数据(基于12位*500000kHz 的传输速率)。
我根据 TivaWare USB 批量驱动程序(usbdbbulk.c/.h)的某些部分创建了定制的 USB 批量器件。 未为我通过其发送准备数据的端点启用 USB_EP_AUTO_SET 位。 因此、我将带 USBEndpointDataPut 的数据放入指定的 FIFO、然后将带 USBEndpointDataSend 的数据发送到主机。 我的问题是,我无法达到足以满足我的需要的样例。 如果我通过启用32次硬件过采样将 ADC 采样率设置为31、25kHz、我将获得令人满意的结果。 如果采样率高于此值、SEND_PACKET 函数中的错误计数器将迅速增加。 那么、我的问题是、是否有比我现在更好的方法来发送数据(请参阅下面的代码示例)?
非常感谢您的帮助! 如果您需要更多信息、请告诉我。
此致、
Felix
void ADC0IntHandler (void) { // //清除 ADC 中断 // map_ADCIntClear (ADC0_base、0); if (g_OsziRun) { if (!map_uDMAChannelSizeGet (UDMA_CHANNE_ADC0 | UDMA_PIN_SELECT))}{ // 完成 GPIO4+、GPIO_PEDIT_RECODE_TO_4;GPIO4+ TOP_ TOP_ TO_TOP_ TOP_ TOP_ 4;GPIO+ TOP_ TOP_ TOP_ TOP_ TOP_ TOP_ 4 TOP_ TOP_ TOP_ TOP_ TOP_ 4 TOP_ TOP_ TOP_ TOP_ TOP_ TOP_ TOP_ TOP_ TOP_ TOP_ TOP_ //调试用途 MAP_uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_PRI_SELECT、 UDMA_MODE_PINGONG、 (void *)(ADC0_BASE + ADC_O_SSFIFO0 +(0x20 * 0))、 G_ulAdc0Buf_ping、ADC0_base (ADC0_GP_SDK_MAP_ENABLE_DRESS_UDC0_SDO +(0x20 * 0)))、gpin_PORTAM_PORTAL_SDO (UDIOSIZE (UANCE_MA_BOOSIZE (0x20 *) GPIO_PIN_7、GPIO_PIN_7);//调试目的 create_oszi_packet (g_ui8ADCModules、ping_done); map_GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_7、0);//调试用途 MAP_GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_0、GPIO_PIN_0); SEND_PACKET (PING_DONE); MAP_GPIOPinWrite (GPIO_PORTB_BASE、 GPIO_PIN_0、0); } 否则(!map_uDMAChannelSizeGet (UDMA_CHANNE_ADC0 | UDMA_ALT_SELECT) ){ // g_ulAdcBuf_pong 已准备好处理 //重写通道配置以进行下一个传输 //翻转引脚 PA4 g_ulBadiphap_is0+ 、GPIO2+、GPIO0_PON_PON_TO_PED;GPIO0_GPIO0_GPIO_PON_PON_TO_PON_PON_PON_TO_PON_PON_TO_PON_P= GPIOR //调试用途 MAP_uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_ALT_SELECT、 UDMA_MODE_PINGONG、 (void *)(ADC0_BASE + ADC_O_SSFIFO0 +(0x20 * 0))、 G_ulAdc0Buf_pong、ADC0_base + ADC0_ADC0_MA_SET_ENABLE_MA_SIZE ;GP_SDK_REGPT_MA_SET_MA_MA_USDK_SIZE (0x20 *)、GPADCK_REGPT_MA_MA_MA_MA_MA_MA_MA_MA_MA_MAK_SIZE GPIO_PIN_7、GPIO_PIN_7);//调试目的 create_oszi_packet (g_ui8ADCModules、pong_done); send_packet (pong_done); //map_GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_7、 0); } 否则 { //正常 ADC 中断、不是 uDMA 中断/什么????? g_ulIntOsziCount++; } }void send_packet (uint8_t ui8PingPoong) { static uint32_t routine_count、packet_sent、errorcounter; uint8_t buffer_mode = ui8PingPoong; uint8_t *pData; int32_t Ret32_t i32code; uint32+ 例程;uint+ uintePing+ pData =(uint8_t *)&packet_one; i32Retcode = map_USBEndpointDataPut (USB0_BASE、USB_EP_4、pData、63); ui32EPStatus = MAP_USBEndpointStatus (USB0_BASE、USB_EP_4); if (i32Retcode!=-1) { i32Retcode = MAP_USBEndpointDataSend (USB0_BASE、USB_EP_4、USB_TRANS_IN); packet_send++; } else { error+}; }