我按照DATASHEET中的时序对LMP90098进行性读取,但是读取回来的数据全部是0xff,用示波器测量SDO脚,是高电平。我用的是atmega128主控IC,SPI接口是IC内部自动产生时序,用(1/128)MHZ的时序频率,这个接口上还带有其他IC,那些IC工作正常。LMP90098采用内部振荡器,留有外部振荡器接入方式,我估计是程序时序有问题:
lmp90098写操作如下:
void Wtlmp90098(unsigned char regAdd,unsigned char*val,unsigned char ct)//寄存器地址、数据、数据量
{
unsigned char ha;
unsigned cahr ch=0;
ha=(regAdd&0xf0)>>4;
if((ct-1)<0x04) ch=(ct-1); else ch=3;
ch<<=5;//设置数据尺寸
ch|=(regAdd&0x0f)//设置数据低地址
adc_on()//拉低csb信号
SPI_WR(0X10);//高地址写入命令
SPI_WR(ha);//写入高地址
SPI_WR(ch);//写入低地址
for(int i=0;i<ct;i++)
SPI_WR(val[i]);//写入数据
adc_off();//拉高csb信号
}
LMP90098读操作如下:
void Wtlmp90098(unsigned char regAdd,unsigned char*val,unsigned char ct)//寄存器地址、数据、数据量
{
unsigned char ha;
unsigned cahr ch=0;
ha=(regAdd&0xf0)>>4;
if((ct-1)<0x04) ch=(ct-1); else ch=3;
ch<<=5;
ch|=(regAdd&0x0f);
ch|=0x80;//设置读信号
adc_on()//拉低csb信号
SPI_WR(0X10);//高地址写入命令
SPI_WR(ha);//写入高地址
SPI_WR(ch);//写入低地址
for(int i=0;i<ct;ct++) val[i]=SPI_WR(0);
adc_off();//拉高csb信号
}