CC1110 的DMA 采用16bit字模式,源为SFR时会出现高低字节反序,而源为SRAM时则正常
本身想利用 DMA 高速读取ADC,满64次后再进行ADPCM压缩。
ADC结果寄存器是小端排列符合IAR EW8051小端要求,刚刚好
却发现 使用 DMA_WORDSIZE_WORD 16bit字模式时 ,ADC结果在目标SRAM会出现高低字节反序,需要自己手动反序才能进行ADPCM运算 ,晕死。
如果改成字节模式,那就每次只能读2个字节(1次ADC结果),用DMA的意义跟0差不多。
寄存器测试, 结果是高低字节反序
#define X_ADCL XREG( 0xDFBA )
#define X_ADCH XREG( 0xDFBB )
#define X_RNDL XREG( 0xDFBC )
#define X_RNDH XREG( 0xDFBD )
#define X_U0DBUF XREG( 0xDFC1 )
#define X_U0BAUD XREG( 0xDFC2 )
SRCADDR 指向 0xDFBA(X_ADCL) 那么 SRAM_BUF的结果是 ADCH1,ADCL1 ADCH2,ADCL2
SRCADDR 指向 0xDFBB(X_ADCH) 那么 SRAM_BUF的结果是 RNDL, ADCH1, RNDL, ADCH2
SRCADDR 指向 0xDFBC(X_RNDL) 那么 SRAM_BUF的结果是 RNDH, RNDL, RNDH, RNDL
// 对应 CC2540协议栈
SRCADDR 指向 0xDFBC(X_U0DBUF) 那么 SRAM_BUF的结果是 U0BAUD,U0DBUF, U0BAUD,U0DBUF,
===================
SRAM测试 ,结果是不改变字节顺序
SRAM_SRC 数据是 0x11,0x22
SRCADDR 指向 SRAM_SRC 那么 SRAM_BUF的结果 是 0x11,0x22, 0x11,0x22
===========================================
我能找到官方的唯一一个 ADC DMA例子,却是字节模式, 每次只能读取1次结果的DMA (wtf?)
adc_cont_dma_seq.c // SWRC117 - cc1110_cc2510_Basic Software_Examples
里面的设置是
DMA_WORDSIZE_BYTE , 字节模式
LEN=2 , ADC结果是16bit,所以是2字节
DMA_SRCINC_1 源地址每次+1
DMA_DESTINC_1 目标地址每次+1
DMA_TMODE_BLOCK 每次传输1块(就是前面的2字节)
5个DMA通道对应5个ADC通道,只能读一次结果, 再启动就重复刷新目标缓冲区。
简直就是没卵用啊
===============================
网上唯一关于 DMA_WORDSIZE_WORD 的讨论就是 CC2540协议栈高速串口通信解决(UART的DMA方式)
官方代码 是同时读取 X_U0DBUF 和 X_U0BAUD (字模式,源地址指向X_U0DBUF )
#define X_U0DBUF XREG( 0xDFC1 )
#define X_U0BAUD XREG( 0xDFC2 )
例子中 U0BAUD = 0xD8
外部发送的数据是 0x01,0x02,0x03,0x04
而SRAM_BUF的排列却是 0xD8,0x01,0xD8,0x02,0xD8,0x03,0xD8,0x04
很明显是 源高地址U0BAUD的值 却被传输到 目标的低地址 上
===============================
有其他用户使用过字模式的DMA传输么?
能否确认 TI 8051核的DMA存在这个特殊BUG?
(翻了好多CC11xx CC24xx CC25xx 的规格书都找不到相关描述 ,网上也找不到16bit DMA的应用 )
迟点再看看DMA写入寄存器是否存在相同的反序现象
@AZ