请帮忙分析下时序,上面是24位ADC AD7712的写寄存器时序,为什么我的程序总是不正确。对于上面的写时序,我理解是: Ao是控制选择向寄存器写数据的,需置零,将CLK置低,TFS置高。将TFS置低开始写操作。然后将需要些的数据的最高位放于串行接口上,将SCLK置高(产生一个上升沿),ADC在CLK的高电平时将数据位锁存,然后将SCLK置低,产生一个下降沿,说明第一位已经结束。然后将次高位放在串口线上,然后上升沿,再下降沿……直到发完24位数据。我就按以上思路进行的编程,可是操作不正确,发现寄存器内容并未写进去。程序如下,请大虾们帮忙看看…… /*AD7712子程序*/ void Initial_AD7712() // { uint j=0; WriteCommand_AD7712(0x22830D,1); //通道2校准 _nop_(); WriteCommand_AD7712(0x02830D,1); //通道2正常模式 _nop_(); }
void WriteCommand_AD7712(ulong writebyte, ch) // { uint i = 0, k = 0; KDLATCH = 0xFF; // ADTFS = 1; ADSCLK = 0; //ADSCLK置0 KDLATCH = 0xEF; //将ADTFS置0准备进行写操作; for(i=24; i>0; i--) { if (writebyte & 0x00800000) // ADSDATD = 1; else ADSDATD = 0; //将数据位赋值 _nop_(); ADSCLK = 1; //上升沿锁存数据 _nop_(); ADSCLK = 0; _nop_(); writebyte<<=1; } KDLATCH = 0xFF; //ADTFS置 1; }
void ReadData_AD7712() { uint i = 0; KDLATCH = 0xFF; // ADRFS = 1; ADSCLK = 0; while(ADDRDY); //判断是否有数据转换完成 KDLATCH = 0xDF; // ADRFS = 0; for(i=8; i>1; i--) { a0 = ADSDATD; a <<= 1; ADSCLK = 1; _nop_(); ADSCLK = 0; _nop_(); } ADSCLK = 1; _nop_(); ADSCLK = 0; _nop_(); a0 = ADSDATD; Read_HByte = a;
a = 0; for(i=8; i>1; i--) { a0 = ADSDATD; a <<= 1; ADSCLK = 1; _nop_(); ADSCLK = 0; _nop_(); } ADSCLK = 1; _nop_(); ADSCLK = 0; _nop_(); a0 = ADSDATD; Read_MByte = a;
a = 0; for(i=8; i>1; i--) { a0 = ADSDATD; a <<= 1; ADSCLK = 1; _nop_(); ADSCLK = 0; _nop_(); } ADSCLK = 1; _nop_(); ADSCLK = 0; _nop_(); a0 = ADSDATD; Read_LByte = a; KDLATCH = 0xFF; //ADRFS = 1; } 本来程序中设置是按24位模式进行数据转换,结果读取时,只能读取16位,证明参数设置未成功。
|