CH563 USB数据交互测试 目的:实验实现CH563通过USB接口和PC进行数据下载和上传。
测试前准备:
1. 演示开发板;
2. DEBUG372 的VisualStudio工程或测试程序;(使用VS2010编译后,该程序有BUG。)
3. CH563的CH563EVT\EXAM\USB\DEVICE\CH372 单片机程序。
测试开发环境:Win7 64bit, uVision4, VS2010.
一.测试过程
所有功能修改完毕后。
Step1:启动CH563演示板;
Step2:在PC的控制面板可以看到外部接口\USB CH372/CH375.
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps74B7.tmp.jpg
Step3: 启动DEBUG372.exe。然后点击“启动设备”;点击“下传”,将数据发送到MCU;点击“上传”,可以收到从MCU反馈回来的数据。结果如下图。 下传的6个字节的数据,上传后,每个字节的数据被增加了1.
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps74D7.tmp.jpg
这样就实现了数据上传和下载。
二.程序修改
下面介绍程序的修改。
使用VS2010 修改PC的程序,需要将显示函数改为:
[size=9.5000pt]void[size=9.5000pt] ShowUpdata(PCHAR addbuf,ULONG AddLen){[size=9.5000pt]//向上传数据框内添加数据
[size=9.5000pt] [size=9.5000pt]int[size=9.5000pt] TextLen;
[size=9.5000pt] [size=9.5000pt]TextLen = ::GetWindowTextLength(GetDlgItem(WndHandle,IDC_UPDATABuf));
[size=9.5000pt] [size=9.5000pt]if[size=9.5000pt](TextLen>0){
[size=9.5000pt] [size=9.5000pt] [size=9.5000pt]char[size=9.5000pt] prestr[2048];
[size=9.5000pt] [size=9.5000pt] [size=9.5000pt]::GetDlgItemText(WndHandle,IDC_UPDATABuf,(PCHAR)prestr,2048);
[size=9.5000pt] [size=9.5000pt] [size=9.5000pt]strncat_s(prestr,[size=9.5000pt]"\r\n"[size=9.5000pt],2);
[size=9.5000pt] [size=9.5000pt] [size=9.5000pt]strncat_s(prestr,addbuf,AddLen+1);
[size=9.5000pt] [size=9.5000pt] [size=9.5000pt]::SetDlgItemText(WndHandle,IDC_UPDATABuf,(PCHAR)prestr);
[size=9.5000pt] [size=9.5000pt]}
[size=9.5000pt] [size=9.5000pt]else[size=9.5000pt]{[size=9.5000pt]//当前数据框内没有数据
[size=9.5000pt] [size=9.5000pt] [size=9.5000pt]::SetDlgItemText(WndHandle,IDC_UPDATABuf,addbuf);
[size=9.5000pt] [size=9.5000pt]}[size=9.5000pt]
[size=9.5000pt] [size=9.5000pt]return[size=9.5000pt];
[size=9.5000pt]}
原来的代码内存处理有问题。这个代码不是完美的,但是演示使用没问题。
使用uVision4修改单片机程序,修改的地方如下:
[size=8.0000pt]UINT8 USB_Recv_Buf[ 512 ]; [size=8.0000pt]//UINT32 USB_Recv_Buf[ 512/4 ]; /* USB设备数据接收缓冲区 */
[size=8.0000pt]UINT8 USB_Tran_Buf[ 512 ];[size=8.0000pt] //UINT32 USB_Tran_Buf[ 512/4 ]; /* USB设备数据发送缓冲区 */
[size=8.0000pt]void USBDev_EP2_OUT_Deal( void )
[size=8.0000pt]{
[size=8.0000pt] UINT32 len;
[size=8.0000pt]
[size=8.0000pt]#if MY_DEBUG_PRINTF
[size=8.0000pt] printf(" USBDev_EP2_OUT_Deal... \n");
[size=8.0000pt]#endif
[size=8.0000pt] /* 从下传缓冲区中提取数据 */
[size=8.0000pt] if( gUsbSpeed == USB_DEV_SPEED_HS ) /* 高速模式 */
[size=8.0000pt] {
[size=8.0000pt] len = USBDev_RD_FIFOx( USB_DMA_ACC_F2, 512, (PUINT8)USB_Recv_Buf ); /* 读取EP2_OUT包 */
[size=8.0000pt] }
[size=8.0000pt] else
[size=8.0000pt] {
[size=8.0000pt] len = USBDev_RD_FIFOx( USB_DMA_ACC_F2, 64, (PUINT8)USB_Recv_Buf ); /* 读取EP2_OUT包 */
[size=8.0000pt] }
[size=8.0000pt]
[size=8.0000pt] /* 将数据取反后通过上传端点返回 */
[size=8.0000pt] gRecvLen = len;
[size=8.0000pt] for( len = 0; len < gRecvLen; len++ )
[size=8.0000pt] {
[size=8.0000pt] [size=8.0000pt] [size=8.0000pt]USB_Tran_Buf[ len ] = USB_Recv_Buf[ len ]+1; [size=8.0000pt]//USB_Tran_Buf[ len ] = ~USB_Recv_Buf[ len ];
[size=8.0000pt] }
[size=8.0000pt] USBDev_EP2_IN_Deal( );
[size=8.0000pt]}
[size=8.0000pt]
[size=12.0000pt]将缓冲区的数据修改为UINT8, 缓冲区按照字节进行修改。
[size=12.0000pt]
[size=12.0000pt]后续问题:在这种情况下,设备数据交互的速度如何,实在不知道如何测试。
[size=12.0000pt]Any question :QQ 67259275, mail:67259275@qq.com
|