在我的调试过程中,发现两个问题。
第一,AD7712控制寄存器写不进去。我拿来一个新的芯片,然后就写进去了。等到你重新给板子上电之后,就发现写不进去。怎么读取控制寄存器的值都是默认值。
第二,在控制寄存器写入成功后,读取AD值,发现,当外部电压为0的时候读取出数值为7FFFFF,然后当电压超过2.5V之后读取数值为000000,只有当电压在0-2.5V时才能读出数。
硬件就是最基本电路,什么都没有。我的控制寄存器写入的数据时0x228146.选择的是2通道,增益为1.范围应该为-10V~+10v才对呀!
下面是我的C代码,MCU是PIC18F4520
void writeAD7712(U32 data, U8 add)
{
U8 i = 0;
U8 bitTmp = 0;
ODATA = 0;
WDATA();//DATA口改为输出状态
switch(add)
{
case CTRL_REG:
A0 = 0;
break;
case DATA_REG:
A0 = 1;
break;
default:
A0 = 1;//默认处理数据寄存器或者校正寄存器
}
RFS = 1;
TFS = 0;
for(i = 0; i < 24; i++)
{
if(data & 0x00800000)
{
ODATA = 1;
}
else
{
ODATA = 0;
}
Nop();
SCLK = 1;
delaySPI();
SCLK = 0;
delaySPI();
data <<= 1;
}
TFS = 1;
A0 = 1;
SCLK = 0;
}
void readAD7712(U8 add)
{
U8 i = 0;
static U32 tempData = 0;
RDATA();
if(0 == _cnt)//开始读取
{
while(DRDY);
switch(add)
{
case CTRL_REG:
A0 = 0;
break;
case DATA_REG:
A0 = 1;
break;
default:
A0 = 1;//默认处理数据寄存器或者校正寄存器
}
RFS = 0;
TFS = 1;
}
if(0 == RFS)
{
if(0 == SCLK)
{
SCLK = 1;
if(IDATA)
{
tempData++;
}
}
else
{
if(_cnt < 23)
{
tempData <<= 1;
}
_cnt++;
SCLK = 0;
}
}
if(24 == _cnt)
{
static U8 vl = 0;
SCLK = 0;
RFS = 1;
TFS = 1;
readValue[vl] = tempData;
vl = ++vl % 50;
tempData = 0;
_cnt = 0;
}
}
void main(void)
{
RCONbits.IPEN = 1;
INTCON = 0x00;
INTCON2 = 0x00;
INTCON3 = 0x00;
PIE1 = 0x00;
PIE2 = 0x00;
PIR1 = 0;
PIR2 = 0;
INTCONbits.GIE = 0;//关闭全局中断及外设中断
INTCONbits.PEIE = 0;
initTimer0();
initIOPort();
initAD7712();
INTCONbits.PEIE = 1;//打开全局中断及外设中断
INTCONbits.GIE = 1;
while(1)
{
if(sysTick > 5)
{
sysTick = 0;
readAD7712(CTRL_REG);
}
}
}
请各位帮帮忙看看哪有问题~
我的QQ:23158314 |