本帖最后由 haolaishi 于 2013-1-22 22:30 编辑
单片机用的STC12C5A60S2,1T的单片机,现已验证5532复位成功,但是读取AD值时都为ff?
现在有几个疑问
1.5532只有一个数据存储寄存器,可是有两个通道,如何确定所读数值是哪一通道的呢?
2.通道设置寄存器setup的作用,如何对应物理通道呢?
3.数据存储寄存器是否有8bit的读命令,如何读取呢?
如果有哪位前辈用过5532,求指教,下面附上程序。。。
- /**************************************
- ;WWW.STCMCU.COM
- ;Mobile:13922805190
- ;0755-82948412
- AT24C04测试程序
- 主芯片 : STC12C5A60S2 (1T)
- 工作频率: 12.000MHz
- **************************************/
- #include "cs5532.h"
- mtb_1[5]={0x03,0x22,0x00,0x00,0x00};//0x03写配置寄存器 0x20选择复位,参考电压选择2.5~VA+,其余默认 复位AD,并配置功能
- unsigned char xdata tep5[4]={0};
- unsigned char xdata tep4[4]={0};
- //////写一个字节数据到5532
- void WriteCs5532(unsigned char da)
- {
- unsigned char loop;
- ad_sck=0;
- delay_1us();
- for(loop=0;loop<8;loop++)
- {
- da=da<<1;
- ad_di=CY;
- ad_sck=1;
- delay_1us();
- ad_sck=0;
- delay_1us();
- }
- }
- /////从cs5532内部单元读出一个字节
- unsigned char ReadCs5532(void) ///读a/d
- {
- unsigned char loop,da;
- ad_sck=0;
- delay_1us();
- for(loop=0;loop<8;loop++)
- {
- da=da<<1;
- da=da|ad_do;
- ad_sck=1;
- delay_1us();
- ad_sck=0;
- delay_1us();
- }
- return(da);
- }
- unsigned long ReadCs5532_ADvalue(void) ///读a/d转换寄存器中的值 此段即读AD值得程序,有疑问?
- {
- unsigned char i;
- unsigned long temp0=0,temp1=0,temp2=0,temp3=0,reg=0;
- for(i=0;i<8;i++)
- {
- WriteCs5532(0xff);
- }
- temp0=ReadCs5532();
- temp1=ReadCs5532();
- temp2=ReadCs5532();
- temp3=ReadCs5532();
-
- reg=temp0<<24|temp1<<16|temp2<<8|temp3;
- return reg>>11;
- }
- unsigned long ReadCs5532_Reg(void) ///读a/d转换寄存器中的值
- {
- unsigned long temp;//返回值
- tep5[0]=ReadCs5532();
- tep5[1]=ReadCs5532();
- tep5[2]=ReadCs5532();
- tep5[3]=ReadCs5532();
- temp=((unsigned long)tep5[0])<<24|((unsigned long)tep5[1])<<16|((unsigned long)tep5[2])<<8|((unsigned long)tep5[3]);
- return temp;
- }
- void InitCs5532(void) ///a/d初始化
- {
- unsigned char loop;//配置寄存器中的32位数据
-
- ad_do=1;
- ad_di=0;
- ad_sck=0;
- delay_10ms(2);
- for (loop=0;loop<31;loop++)//初始化,写15个字节SYNC1
- {
- WriteCs5532(0xff);
- }
- WriteCs5532(0xfe); //写一个字节的SYNC0
- for (loop=0;loop<5;loop++) //写入复位命令
- {
- WriteCs5532(mtb_1[loop]);
- }
-
- WriteCs5532(0x0b); //读配置寄存器
- if(ReadCs5532_Reg()==0x10000000)//验证是否复位成功
- {
- PutString(0,18,"rest is ok!");
- }
- else
- {
- PutString(0,18,"rest is wrong!");
- }
- WriteCs5532(0x03);//写配置寄存器
- WriteCs5532(0x00);//
- WriteCs5532(0x08);
- WriteCs5532(0x00);
- WriteCs5532(0x00);
- WriteCs5532(0x05);// 写通道设置寄存器 **通道设置寄存器,有疑问?
- WriteCs5532(0x40);//物理通道2,增益1
- WriteCs5532(0x80);//通道2的偏移和增益
- WriteCs5532(0x40);
- WriteCs5532(0x80);
- WriteCs5532(0xc0); //执行转换命令 向CS5532中写入启动A/D连续转换 (8位串口命令)
- }
复制代码
然后再看看外围电路的接法是不是正确, 正负12V,5V,参考电压等。有一次我的供电电压没接对,也直接导致不能正常读出数据。
CS5532,价钱也不便宜,功耗也高,只是一个ADC芯片,供电电流都需要十几mA。外围电路要多累赘有多累赘,但还是有那么多人用。
一周热门 更多>