原创 CS5532调试笔记

2010-1-20 18:24 7273 13 13 分类: MCU/ 嵌入式

                               CS5532调试笔记


Microsoft eMbedded Visual C++ 平台下调试CS5532,遇到些问题,做如下记录:


1.       CS5531/2/3/4通道的问题


两通道的是CS5531/2CS553116bit精度,CS553224bit精度);


四通道的是CS5533/4CS553316bit精度,CS553424bit精度)。




<?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进行系统初始化,分两步:一:串口初始化,通过发送15SYNC1(0xffH),然后再一个SYNC0(0xfeH)就可以完成串口初始化,我的程序中为了更可靠给AD连续发了31SYNC1;二:系统初始化,通过给Configuration RegisterD29位的RS1,会引起AD复位,复位有效(成功)的提示标志是Configuration RegisterD28RV被自动置为1,当对Configuration Register进行读取时,AD会自动把RV0


       AD复位成功后,下列寄存器会变为如下的初值(左边):


      


如果不是上述初值,只能说明AD初始化没有成功。我的AD初始化之后出现上图右边的值,Gain Register寄存器的置为00000001,而不是01000000,初始化不成功!


初始化正确之后就可以对相应的通道进行设置。


①设置Configuration Register


②设置Channel Step Registers(CSR):有4CSR  <?xml:namespace prefix = st1 ns = "isiresearchsoft-com/cwyw" />{CSR1(Setup1Setup2)CSR2(Setup3Setup4)CSR1(Setup1Setup2)CSR2(Setup3Setup4)},每一个转换物理通道可以任意使用CSR,不用一一对应。在Setup中设置它是所于那个具体的物理通道即可。转换的时候只需告诉AD,用哪个setupAD会根据用的这个setup中的设置,按这个设置转换相应的通道。


比如我用的是CS5532,两个物理通道,我对CSR1(Setup1Setup2)进行设置,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的设置。


③进行相应的物理通道校正。


完成上述步骤就可以命令ADsetup**,进行转换。


 


3.       我的问题


上面初始化不成功的原因有点隐蔽,在单片机上运行正常的程序,挪到ARM上进行初始化不成功。单片机用的开发工具是KEILARM上用的是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编译器中认为byte332位中高的8位,byte0是最低的8位;对AD寄存器读数或写数据都是先操作byte3,然后byte2,byte1,最后byte0的(因为AD的时序要求是从高位到低位操作的)。


把上面的联合体的定义直接挪到EVC的环境中就出问题了,它认为byte032位中高的8位,byte3是最低的8位(不信,你可以在KEIL VC6中写个测试代码试试!),所以还按照byte3>byte2>byte1>byte0的顺序操作AD寄存器就不对了。


上面说到我的我初始化之后的Gain Register寄存器的置为00000001,倒过高低8为倒下就是01000000了哈!


我的AD根本就没有初始化:


一:串口初始化是成功的,因为它是给命令寄存器8bit的指令,这个没有问题


二:AD系统初始化是不成功的,32为的命令0x20,00,00,00(RS1)EVC这样是传送byte3(0x00)>byte2(0x00)>byte1(0x00)>byte0(0x02)AD的,显然就不能复位系统了。


就这样折腾了我很久!还怀疑是传感器坏了,把传感器寄还给厂家,现在才知道它是怎么死的我冤死的!


                                                            2010-1-20


                                                           


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
13
关闭 站长推荐上一条 /1 下一条