查阅datasheet(文末有下载链接),发现芯片是SPI进行通信,AD8402有两个输出数字电阻的通道,所以我们我们首先要写入通道选择数据,再写入想要输出的电阻数据。
值得注意的是,当片选信号CS回到高电平时,串行输入寄存器中的数据才会基于地址位进行解码,并载入目标DAC寄存器,所以我们写入数据之后还需要将片选信号拉高。
本人调试过的代码如下,使用的是通过单片机的IO口模拟SPI接口时序,与AD8402通信。
void data_write(unsigned char channel,unsigned char data)
{
unsigned char i=0;
SCS=0;
for(i=0;i<2;i++)
{
if((channel&0x02)==2)
SDO=1;
else
SDO=0;
SCK=1;
channel<<= 1;
GCC_DELAY(4);
SCK=0;
}
for(i=0;i<8;i++)
{
if((data&0x80)==128)
SDO=1;
else
SDO=0;
SCK=1;
data<<= 1;
GCC_DELAY(4);
SCK=0;
}
SCS=1;
}
查阅datasheet(文末有下载链接),发现芯片是SPI进行通信,AD8402有两个输出数字电阻的通道,所以我们我们首先要写入通道选择数据,再写入想要输出的电阻数据。
值得注意的是,当片选信号CS回到高电平时,串行输入寄存器中的数据才会基于地址位进行解码,并载入目标DAC寄存器,所以我们写入数据之后还需要将片选信号拉高。
本人调试过的代码如下,使用的是通过单片机的IO口模拟SPI接口时序,与AD8402通信。
void data_write(unsigned char channel,unsigned char data)
{
unsigned char i=0;
SCS=0;
for(i=0;i<2;i++)
{
if((channel&0x02)==2)
SDO=1;
else
SDO=0;
SCK=1;
channel<<= 1;
GCC_DELAY(4);
SCK=0;
}
for(i=0;i<8;i++)
{
if((data&0x80)==128)
SDO=1;
else
SDO=0;
SCK=1;
data<<= 1;
GCC_DELAY(4);
SCK=0;
}
SCS=1;
}
举报