第一部分写数据
控制电流输出编程的大方向:上电复位AD5410(向复位寄存器写数据)——配置AD5410的控制方式(向控制寄存器写数据)——写数据到AD5410的数据寄存器(跟电流对应的码值)。三个步骤完成就可以输出你想要的电流了,就是按顺序向三个寄存器写数据。
向AD5410寄存器写数据就是一次性写3个字节的数,即24个bit,我用图例表示24个bit:
aaaa aaaa bbbb bbbb bbbb bbbb,a表示第一个要写的字节,b表示第二个和第三个要写的字节(因为b是16个bit,所以分2个字节来写)。a的取值是目的寄存器的地址,比如复位寄存器地址是0x56,则a=0x56(即0101 0110),b的取值就是要写入的目的寄存器的数据。从数据手册上可以看到如果要复位AD5410,则向复位寄存器里面写入0x0001,所以a=0x56,b=0x0001。写数据时需注意latch引脚的电平,写24个bit结束后拉高,在之前拉高的话则写数据会失败,如果不是24个bit,而是25个bit后才拉高的话写数据也失败。写bit时是下降沿写入,即clk为高后准备好bit,然后再将clk拉低,形成一个下降沿。
向复位寄存器写数据的程序如下:
DA_control(0x56,0x0001);
void DA_control(unsigned char addr,unsigned int data)
{
DA_latch_low;//latch为低电平
DA_SendByte(addr);
DA_SendByte(data/256);
DA_SendByte(data);
DA_latch_high; //latch为高电平
}
void DA_SendByte(unsigned char byte)
{
unsigned char i;
for ( i = 0; i < 8; i++)
{
DA_CLK_LOW;
if ( byte & 0x80 )
DA_SIMO_HIGH;
else
DA_SIMO_LOW;
DA_CLK_HIGH;
byte <<= 1;
DA_CLK_LOW;
}
}
同理,可以写控制寄存器和数据寄存器。
第二部分读数据
读寄存器数据编程大方向:选择要读的寄存器——读寄存器数据。
选择要读的寄存器就是向状态寄存器里面写数据,比如我需要读控制寄存器的数据,我就要先想状态寄存器里面写入读控制寄存器命令,然后对AD5410进行一个空操作(即AD5410的SDI接收到24个0-bit),这个时候在AD5410的SDO端口可以看到控制寄存器的数据。
读控制寄存器数据编程如下:
DA_Read_Register(0x02);
DA_Read_only(); //这个时候在AD5410的SDO端口可以看到控制寄存器的数据
void DA_Read_Register(unsigned char addr)
{
DA_latch_low;
DA_SendByte(0x02);//DA_SendByte的程序跟上面的一样
DA_SendByte(0x00);
DA_SendByte(addr);
DA_latch_high;
}
void DA_Read_only(void)
{
DA_latch_low;
DA_SendByte(0x00);
DA_SendByte(0x00);
DA_SendByte(0x00);
DA_latch_high;
}
最后总结一下我们使用个片子出现过的问题
1、我们硬件上使用的片子上推荐的连接方式,Rset接的外部电流电阻,但是我们没有使用推荐的15k低温漂电阻,用的12k的,导致我们初始态多了1mA的电流,把电阻换掉就好了。
2、我们一开始测试时将Iout引脚悬空,这会导致fault低电平,所以Iout需接负载或接地。
最后说一句:ADI的客户服务态度真是非常好,很耐心,而且MM声音好听。