ADS1246读寄存器问题
各位TI大神:
在操作ADS1246的时候,发现可以正常的读转换结果的数据,读不出寄存器数据,也不能把数据写入寄存器。在读写寄存器的时候有哪些需要注意的设置啊,请各位指点一下。
写数据函数:
ADS1246_START_DATA=Low;
DelayUS(20);
ADS1246_CS2_DATA=High;
DelayUS(20);
ADS1246_CS2_DATA =Low; //
// __asm nop; //ÑÓʱ1/20M =50ns ±£Ö¤Ê±Ðò
// ADS1246_SCK_DATA=Low;
DelayUS(20);
DisableInterrupts;
for(i=0;i<8;i++)
{
ADS1246_SCK_DATA =High; //data on din are shifted into the device on the falling edge of sclk
// ADS1246_SCK_DATA =Low;
if(TxBuffer&0x80) //È¡×î¸ßλ
{
ADS1246_DIN_DATA=High; //дÊý¾Ý
}
else
{
ADS1246_DIN_DATA=Low; //дÊý¾Ý
}
// DelayUS(5);
ADS1246_SCK_DATA =Low;
// ADS1246_SCK_DATA =High;
TxBuffer<<=1;
// DelayUS(5);
}
EnableInterrupts;
DelayUS(40);
ADS1246_CS2_DATA =High;//
ADS1246_START_DATA=High;
读数据函数
ADS1246_START_DATA=Low;
DelayUS(20);
ADS1246_CS2_DATA =High;
DelayUS(20);
ADS1246_CS2_DATA =Low;
//ADS1246_SCK_DATA =Low;
DelayUS(10);
DisableInterrupts;
for(i=0;i<8;i++)
{
ADS1246_DIN_DATA=High; //nop
ADS1246_SCK_DATA =High;
//ADS1246_SCK_DATA =Low; //ʱÖÓµÍ
data|=ADS1246_DOUT2_DATA&0x01;
data<<=1;
// DelayUS(5);
ADS1246_SCK_DATA =Low;
//ADS1246_SCK_DATA =High;
// DelayUS(5);
}
ADS1246_DIN_DATA=Low;
EnableInterrupts;
//ADS1246_SCK_DATA =Low; //ʱÖÓµÍ
//ADS1246_SCK_DATA =High;
DelayUS(40);
ADS1246_CS2_DATA =High; //Ƭѡ¸ß
ADS1246_START_DATA=High;
附件为在读第一个寄存器(BCS)时的波形 ,在DOUT上没有发现读取数据的波形。
需要注意的有两点:
1. 手册第10页图1,其中注意一下tSCCS和tCSPW,时间要给够。
2. 手册53页"USER REGISTER READ AND WRITE COMMANDS”。读数据和写数据都需要先写进去两条指令,指定读哪个地址的值以及读几个Byte。另外,读/写寄存器时,不能再发送除读写外的其他指令。
你好!
tSCCS SCLK=LOW 延时大于7个时钟周期 然后CS=HIGH 程序里面已经这样执行了,
tCSPW 完成一个字节操作后CS=HIGH 然后延时大于5个时钟周期,程序里面也是这样执行的。
关于写寄存器操作
发送数据为0x40 ,0x00 ,0x81
读寄存器操作:
发送数据位0x20 ,0x00 ,0xff(nop)
按照上述的东西,DOUT 上面还是没有数据。
从测试图来看,似乎是想写入0x10,0x00,然后读0x00寄存器的值。但是SCLK只有8个,如果想读一个寄存器的值,是不是应该给24个SCLK?16个用来写指令,8个用来读?
写入数据为0x20 0x00 0x00 意思是读地址为0的寄存器的值,另外最上面的截图是完整的波形,有24个SCLK.
没看到有连续的24个SCLK啊,你的波形上只有8个连续的SCLK,然后CLK就直接拉低了。你试试给连续的24个SCLK,用作读时钟,会不会有改善。
感谢Decapton Wang 的支持,按照你的办法,连续给24个时钟,然后CS在此过程中为,就可以读写寄存器了,谢谢!