CS5532调试笔记
在Microsoft eMbedded Visual C++ 平台下调试CS5532,遇到些问题,做如下记录:
1. CS5531/2/3/4通道的问题
两通道的是CS5531/2(CS5531是16bit精度,CS5532是24bit精度);
四通道的是CS5533/4(CS5533是16bit精度,CS5534是24bit精度)。
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
Configuration Register(配置寄存器) 和Conversion Data Register (转换结果寄存器)只有一个。
Offset Registers 和 Gain Registers 对两通道的CS5531/2来说是各2个,对四通道CS5533/4来说各4个,分别对应相应的物理通道,这个很好理解。
但是Channel Step Registers(通道设置寄存器,简称为CSR)对所有的CS5531/2/3/4
都是4个,它和物理通道不是一一对应的,这个和我们的理解不一样。并且 CSR中的setup **不是物理通道,否则的话就8个通道了,哈哈!
2. 对物理通道进行转换操作
由于CS5531/2/3/4不具有上电复位的功能,所以开始转换之前对AD进行初始化设置时必须先要对AD进行系统初始化,分两步:一:串口初始化,通过发送15个SYNC1(0xffH),然后再一个SYNC0(0xfeH)就可以完成串口初始化,我的程序中为了更可靠给AD连续发了31个SYNC1;二:系统初始化,通过给Configuration Register的D29位的RS置1,会引起AD复位,复位有效(成功)的提示标志是Configuration Register的D28位RV被自动置为1,当对Configuration Register进行读取时,AD会自动把RV清0。
AD复位成功后,下列寄存器会变为如下的初值(左边):
如果不是上述初值,只能说明AD初始化没有成功。我的AD初始化之后出现上图右边的值,Gain Register寄存器的置为00000001,而不是01000000,初始化不成功!
初始化正确之后就可以对相应的通道进行设置。
①设置Configuration Register
②设置Channel Step Registers(CSR):有4个CSR <?xml:namespace prefix = st1 ns = "isiresearchsoft-com/cwyw" />{CSR1(Setup1、Setup2)、CSR2(Setup3、Setup4)、CSR1(Setup1、Setup2)、CSR2(Setup3、Setup4)},每一个转换物理通道可以任意使用CSR,不用一一对应。在Setup中设置它是所于那个具体的物理通道即可。转换的时候只需告诉AD,用哪个setup,AD会根据用的这个setup中的设置,按这个设置转换相应的通道。
比如我用的是CS5532,两个物理通道,我对CSR1(Setup1、Setup2)进行设置,Setup1中告诉AD这是对第一个物理通道进行设置,并按这个设置进行转换第一个物理通道的信号;Setup2中告诉AD这是对第二个物理通道进行设置,并按这个设置进行转换第二个物理通道的信号。
CS5532_Write_Command(CMD_WRITE+CMD_CH1+REG_SETUP);
CS5532_Write_Dword(((CSR_CH1+PGA_1+DATARATE_6P25+BIPOLAR_MODE+START_NO_DELAY+CAL_DATA_CH1)<<16)+(CSR_CH2+PGA_1+DATARATE_6P25+BIPOLAR_MODE+START_NO_DELAY+CAL_DATA_CH2));
//选择物理通道1+增益1+数据传送率6.25+双极模式+立即开始+Offset / Gain Register Pointer Bits
黄的表示Setup1的设置,红的是Setup2的设置。
③进行相应的物理通道校正。
完成上述步骤就可以命令AD按setup**,进行转换。
3. 我的问题
上面初始化不成功的原因有点隐蔽,在单片机上运行正常的程序,挪到ARM上进行初始化不成功。单片机用的开发工具是KEIL,ARM上用的是Microsoft eMbedded Visual C++。
由于AD的寄存器中除命令寄存器外都是32位的,所以定义了这样的数据类型:
union { unsigned long rlong;
struct {
unsigned char byte3;
unsigned char byte2;
unsigned char byte1;
unsigned char byte0;
}bytes;
}tempdword;
32位的变量tempdword,在KEIL编译器中认为byte3是32位中高的8位,byte0是最低的8位;对AD寄存器读数或写数据都是先操作byte3,然后byte2,再byte1,最后byte0的(因为AD的时序要求是从高位到低位操作的)。
把上面的联合体的定义直接挪到EVC的环境中就出问题了,它认为byte0是32位中高的8位,byte3是最低的8位(不信,你可以在KEIL 和VC6中写个测试代码试试!),所以还按照byte3>byte2>byte1>byte0的顺序操作AD寄存器就不对了。
上面说到我的我初始化之后的Gain Register寄存器的置为00000001,倒过高低8为倒下就是01000000了哈!
我的AD根本就没有初始化:
一:串口初始化是成功的,因为它是给命令寄存器8bit的指令,这个没有问题
二:AD系统初始化是不成功的,32为的命令0x20,00,00,00(RS为1),EVC这样是传送byte3(0x00)>byte2(0x00)>byte1(0x00)>byte0(0x02)给AD的,显然就不能复位系统了。
就这样折腾了我很久!还怀疑是传感器坏了,把传感器寄还给厂家,现在才知道它是怎么死的—我冤死的!
2010-1-20
文章评论(0条评论)
登录后参与讨论