大家好、Dale、Cynthia、大家都知道 ADS8694!
我尝试在由 F28379 Launchpad 控制的定制板中使用 ADS8694。
我的想法是使用 SPI、但由于没有任何结果、 我决定以蛮力逐步设置的方式检查通信、以查看是否可以解决首先知道芯片是否活跃的问题。
因此、我无法从器件中获得任何反应、我想知道我是否做了一些(很多)事情。
我测试了其中的两个、并焊接在两个不同的板上。
从那个、我什么都没有。 完全没有反应。
从另一个示例中、发送的每个命令只对一个进行一次应答。
您能否查看我使用的以下代码以查看时序是否正确?
在帧起始处、clk 信号必须处于高电平的时刻、我有点困惑。 在 CS 变为低电平之前是否应为高电平?
无论如何、我已经测试了这两种可能性、但都没有成功。
非常感谢
此致、
Gustavo
这是我的代码。 它在 C2000 ware 的 SPI 示例中工作
#include "F28x_Project.h"
//函数原型
void delay_loop (void);
void initSerialPins (void);
void ADS8694_CMD (uint16 a、uint16 clkCycles);
uint16 Cmd0、Cmd1、Cmd2、Cmd3、Cmd4、Cmd5;
uint16 r、i、k;
uint32 rdataadc;
void main (void)
{
//初始化 GPIO
InitGpio();
//清除所有中断并初始化 PIE 矢量表
Dint;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
initSerialPins(); //此函数使用与 SPI 相同的引脚
Cmd0 = 0b10000101; //复位程序寄存器(RST)(1000 0101 00000000)
Cmd1 = 0b11000000; //手动通道 n 选择(MAN_Ch_0)(1100 0000 00000000)
Cmd2 = 0b00000000; //继续使用最后一个配置(0000 0000 00000000)
Cmd3 = 0b00001010; //读取范围通道0 (0000 101 0 00000000)
Cmd4 = 0b00001011; //写入通道0输入范围。 我需要0x0110 (0000 101 1 00000000)
Cmd5 = 0b11010011; // 0b1000001011010011如果一切都按要求返回,则用于在环回模式下进行测试
//仅取消注释要发送到 ADC 的内容
ADS8694_CMD (Cmd0、33); // 复位程序寄存器(0b10000101)
ADS8694_CMD (Cmd4、23); //写入范围 Ch0 (MAN_Ch_0)(0b00001011)(十进制11)
ADS8694_CMD (Cmd3、23); //读取范围 Ch0 (MAN_Ch_0)(0b00001010)(十进制10)
// ADS8694_CMD (Cmd1、33); //手动通道 n 选择(MAN_Ch_0)(0b11000000)
// ADS8694_CMD (Cmd2、33); //继续使用最后一个配置(0b00000000)
/* 继续永久转换
对于(;)
{
ADS8694_CMD (Cmd2、33); //现在测量循环中的通道0。
测量 Nr ++;
delay_loop();
}
*
}
// main 末尾()
void ADS8694_CMD (UINT16 A、UINT16 clkCycles)
{
rdataADC = 0;
GpioDataRegs.GPBSET.bit.GPIO60=1; //将 clk 设置为高电平以开始换用已知位置
delay_loop();
GpioDataRegs.GPBCLEAR.bit.GPIO61=1; //将 CS 设为低电平以启动传输
delay_loop();
for (i=0;i<8;i++) //发送 CMD 8位
{
IF (A & 0b10000000) //如果 a 的第一个字符为1
GpioDataRegs.GPBSET.BIO58 = 1;
其他
GpioDataRegs.GPBCLEAR.bit.GPIO58=1;
GpioDataRegs.GPBTOGGLE.bit.GPIO60=1; // SCLK 低电平- ADC 读取位
delay_loop();
GpioDataRegs.GPBTOGGLE.bit.GPIO60=1; // SCLK 为高电平
delay_loop();
A = A << 1;
}
R=0;
GpioDataRegs.GPBCLEAR.bit.GPIO58=1; //将 SPISIMO 置于低电平的剩余时间
for (i=8;i<16;i++) //发送接下来的八个位= 0
{
GpioDataRegs.GPBTOGGLE.bit.GPIO60=1; // SCLK 低电平- ADC 读取位
delay_loop();
GpioDataRegs.GPBTOGGLE.bit.GPIO60=1; // SCLK 高电平
delay_loop();
}
//在 SCLK 信号的第16个下降沿(已经发生)
//转换数据的 MSB 在 SDO 线上输出,并可由主机处理器在 SCLK 信号的后续(17)下降沿读取。
GpioDataRegs.GPBTOGGLE.bit.GPIO60=1; // SCLK 低第17个下降沿(现在我们可以读取 ADC18的 MSB)
delay_loop();
if (GpioDataRegs.GPBDAT.bit.GPIO59 = 1) //检查 SDO 1或0 (读取8位 ADC 配置的 MSB)
rdataADC = 1;
其他
rdataADC = 0;
GpioDataRegs.GPBTOGGLE.bit.GPIO60=1; // SCLK 高电平
delay_loop();
for (i=16;<clkCycles;i++)
{
GpioDataRegs.GPBTOGGLE.bit.GPIO60=1; // SCLK 为低电平
delay_loop();
if (GpioDataRegs.GPBDAT.bit.GPIO59 = 1) //检查 SDO 1或0
R = 1;
其他
R = 0;
rdataADC = rdataADC << 1; //将接收到的数据 MSB 置为8或18位
rdataADC = rdataADC | r; //将接收到的数据 MSB 置为8或18位
GpioDataRegs.GPBTOGGLE.bit.GPIO60=1; // SCLK 高电平
delay_loop();
}
GpioDataRegs.GPBCLEAR.bit.GPIO60=1; //将 clk 设置为低,确保传输停止
GpioDataRegs.GPBSET.bit.GPIO61=1; //将 CS 设置为高电平以结束传输
返回;
}
// delay_loop -添加延迟的函数
//
void delay_loop ()
{
long k;
对于(k = 0;k < 10000;k++){}
}
空 initSerialPins()
{
EALLOW;
GpioCtrlRegs.GPBGMUX2.bit.GPIO58 = 0; // GPIO58 = GPIO58 (SPISIMOA)
GpioCtrlRegs.GPBGMUX2.bit.GPIO59=0; // GPIO59 = GPIO59 (SPISOMIA)
GpioCtrlRegs.GPBGMUX2.bit.GPIO60=0; // GPIO60 = GPIO60 (SPICLKA)
GpioCtrlRegs.GPBGMUX2.bit.GPIO61=0; // GPIO61=GPIO61 (SPISTEA)
GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 0; // GPIO58 = GPIO58 (SPISIMOA)
GpioCtrlRegs.GPBMUX2.bit.GPIO59=0; // GPIO59 = GPIO59 (SPISOMIA)
GpioCtrlRegs.GPBMUX2.bit.GPIO60=0; // GPIO60 = GPIO60 (SPICLKA)
GpioCtrlRegs.GPBMUX2.bit.GPIO61=0; // GPIO61=GPIO61 (SPISTEA)
GpioCtrlRegs.GPBPUD.bit.GPIO58 = 0; //在 GPIO58上启用上拉(SPISIMOA)
GpioCtrlRegs.GPBPUD.bit.GPIO59=0; //在 GPIO59上启用上拉电阻(SPISOMIA)
GpioCtrlRegs.GPBPUD.bit.GPIO60=0; //在 GPIO60上启用上拉(SPICLKA)
GpioCtrlRegs.GPBPUD.bit.GPIO61=0; //启用 GPIO61上的上拉电阻器(SPISTEA)
GpioCtrlRegs.GPBDIR.bit.GPIO58 = 1; //将 GPIO58配置为输出(SPISIMOA)
GpioCtrlRegs.GPBDIR.bit.GPIO59 = 0; //将 GPIO59配置为输入 (SPISOMIA)
GpioCtrlRegs.GPBDIR.bit.GPIO60=1; //将 GPIO60配置为输出(SPICLKA)
GpioCtrlRegs.GPBDIR.bit.GPIO61=1; //将 GPIO61配置为输出(SPISTEA)
// GPIO111用于 ADS8694的硬件复位。
//必须为高电平才能激活它
GpioCtrlRegs.GPDGMUX1.bit.GPIO111 = 0; // GPIO111 = GPIO111
GpioCtrlRegs.GPDMUX1.bit.GPIO111 = 0; // GPIO111 = GPIO111
GpioCtrlRegs.GPDDIR.bit.GPIO111 = 1; //将 GPIO111配置为输出
GpioCtrlRegs.GPDPUD.bit.GPIO111 = 0; //启用 GPIO111 (RST)上的上拉
GpioDataRegs.GPDSET.BIPO111 = 1; //将 GPIO111设置为高电平!!!! 以激活 ADS8694
EDIS;
}