阅读:1413回复:0
D12数据采集差最后一步了,大家都来帮分析一下啊!解决了把本人的可用分全部相送
各位好,我买了周立功的USB D12 SMART套件,根据其现在开发一个USB的数据采集系统,采用的单片机ADUC812+D12+外部RAM,主要思路是:ADUC812是自带12位A/D的单片机,我使用DMA方式的数据采集,先直接把采到的数据存储在外部RAM,然后通过D12把数据传输到PC机上,根据USB D12 SMART套件的原理图,我做了类似的一块板子,然后固件上也做了相应的改动,这个块板子枚举也成功了,没加上A/D采集的程序时,USB通信也能正常工作,但是一加上A/D采集的程序时,USB通信就出现问题,主要表现在:端点2读数据失败,而端点1和端点2的写数据都能成功,就是读出了问题。端点的读写我是用了周立功EasyD12.dll动态连接库中的4个函数,即ReadPort1(),WritePort1(),ReadPort2(),WritePort2()。
下面是我用到的A/D中断处理函数 // A/D中断处理函数,主要是关定时器2和A/D中断,A/D的触发信号是由定时器2 的益出位来提供的 adc_isr() interrupt 6 { DISABLE; TR2 = 0; EADC = 0; bEPPflags.bits.ep2_txdone = 1; ENABLE; } //端点1 out 处理 void ep1_rxdone(void) { unsigned char len; D12_ReadLastTransactionStatus(2); //清中断标志位 len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf);//读取数据 if(len != 0) bEPPflags.bits.ep1_rxdone = 1;//标志接收到数据 } //主端点IN控制 端点号5 void main_txdone(void) { D12_ReadLastTransactionStatus(5); //清中断标志 bEPPflags.bits.ep2_txdone = 1; } 下面是在MAINLOOP.C主循环while(){ }中自己添加的部分,其他与周立公一样 // 在mainloop.c主循环中增加了端点5的处理,当MCU收到主端点OUT时,通过标志位bEPPflags.bits.ep2_txdone 是否等于 1来判断是否要向端点号5的缓冲区写64B的数据,这64B的数据是存在外部RAM的,所以要先读到内部的BUFFER, if(bEPPflags.bits.ep2_txdone == 1) { DISABLE; MCU_D12CS = 0x1; MCU_RAMCS = 0x0; // 外部RAM的片选信号有效 if(RamCount == 33) // RamCount是一个全局变量 RamCount = 0; // 用来实现对外部RAM 0 到2112 地址范围寻址 RamCount++; for(j=0; j<64; j++) // 从外部RAM读数据到内部BUFFER EpBuf[j] = XBYTE[RamCount*64+j] ; MCU_RAMCS = 0x1; MCU_D12CS = 0x0; // D12的片选信号有效 D12_WriteEndpoint(5, 64, EpBuf); bEPPflags.bits.ep2_txdone = 0 ; ENABLE; } // 在mainloop.c主循环中增加了端点1 OUT(端点号为2)的处理, 用来控制A/D采集的开始。MCU收到端点1 OUT的中断时,会置标志位bEPPflags.bits.ep1_rxdone。 if(bEPPflags.bits.ep1_rxdone == 1) { DISABLE; bEPPflags.bits.ep1_rxdone = 0 ; MCU_D12CS = 0x1; MCU_RAMCS = 0x0; // 以下都是A/D转换前对MCU的SFR进行初始化。 T2CON = 0x00; DMAL = 0; DMAH = 0; DMAP = 0; RCAP2L = 0x0E0; //触发后重新载入Timer2 的值 RCAP2H = 0x0FF; TL2 = 0x0E0; //预置 Timer2 的值 TH2 = 0x0FF; ADCCON1 = 0x62; ADCCON2 = 0x41; EADC = 1; // 开A/D中断 TR2 = 1; // 开定时器2 ENABLE; } 另外,我还实验了没用DMA方式时的A/D采集,那样的话USB通信能成功,但是还是偶尔有几次出现读端点2失败。难道是DMA方式有问题? 现在最不明白的就是端点2读经常出现失败,这是什么原因呢? 望各位大侠指点迷津! |
|