程序初始化后主控每10ms向ADS1255发送一次读寄存器指令,从示波器可观测到正确发送了波形,同时ADS1255的DRDY引脚可以正常观察到30KHZ的信号,但DOUT引脚始终无输出(无论输入什么指令)。
最初的问题是发现无源晶振无法正常起振,多次更换晶振型号和起振电容无果后,改为飞线接入7.68MHz有源晶振,可观测到正确晶振波形。

随后发现DOUT始终无应答。下附各SPI引脚工作情况:




从图像可得出信息:主控可以正确的控制SCLK(500KHz)、MOSI(已经校对过指令)、CS引脚发送信号,DOUT始终无输出。
随后尝试取下DOUT与主控之间100Ω电阻,直接测量ADS1255各个引脚,结果发现其他SPI引脚均收到了取信号,但DOUT仍然无输出。
打值测量ADS1255各引脚供电均符合预期,AGND与DGND共地良好,AGND上电后与主控最远的DGND(USB金属外壳)之间有0.06V~0.01V间变化的压差,但应该不至于产生严重影响。
下附原理图与周边pcb布局:

目前XTAL1已更改为7.68MHz有源晶振输入,XTAL2无连接;
C20已更改为10uF。

软件SPI相关代码如下:
#include"ADS1255_NRF_DRV.h"
//SPIÇý¶¯³ÌÐòʵÀýID,IDºÍÍâÉè±àºÅ¶ÔÓ¦£¬0:SPI0 1:SPI1 2:SPI2
#define SPI_INSTANCE 0
static const nrf_drv_spi_t SPI0 = NRF_DRV_SPI_INSTANCE(SPI_INSTANCE);
//SPI
static volatile bool spi_xfer_done;
static uint8_t spi_tx_buf[6];
static uint8_t spi_rx_buf[6];
#define NRF_ADS1255_SPI0_CFG \
{ \
.sck_pin = NRF_GPIO_PIN_MAP(0,19), \
.mosi_pin = NRF_GPIO_PIN_MAP(0,17), \
.miso_pin = NRF_GPIO_PIN_MAP(0,15), \
.ss_pin = NRF_GPIO_PIN_MAP(1,21), \
.irq_priority = SPI_DEFAULT_CONFIG_IRQ_PRIORITY, \
.orc = 0xFF, \
.frequency = NRF_DRV_SPI_FREQ_500K, \
.mode = NRF_DRV_SPI_MODE_1, \
.bit_order = NRF_DRV_SPI_BIT_ORDER_MSB_FIRST, \
}
// .sck_pin = NRF_GPIO_PIN_MAP(0,19),
// .mosi_pin = NRF_GPIO_PIN_MAP(0,17),
// .miso_pin = NRF_GPIO_PIN_MAP(0,15),
// .ss_pin = NRF_GPIO_PIN_MAP(0,21),
void Spi_WriteOneByte(uint8_t Dat)
{
spi_tx_buf[0] = Dat;
spi_xfer_done = false;
SPI0_CS_LOW;
APP_ERROR_CHECK(nrf_drv_spi_transfer(&SPI0, spi_tx_buf, 1, spi_rx_buf, 0));
while(!spi_xfer_done);
SPI0_CS_HIGH;
}
/*****************************************************************************
** Ãè Êö£ºÐ´ÈëÒ»¸ö×Ö½Ú
** ²Î Êý£ºDat£º´ýдÈëµÄÊý¾Ý
** ·µ»ØÖµ£ºÎÞ
******************************************************************************/
uint8_t SPI_Receive_Send(nrf_drv_spi_t SPIx, uint8_t Data)
{
spi_tx_buf[0] = Data;
spi_rx_buf[0] = 0;
//spi_xfer_done = false;
SPI0_CS_LOW;
nrf_delay_us(1);
nrf_drv_spi_transfer(&SPIx, spi_tx_buf, 1, spi_rx_buf, 1);
//while(!spi_xfer_done);
nrf_delay_us(2);
SPI0_CS_HIGH;
return spi_rx_buf[0];
}
/*****************************************************************************
** Ãè Êö£ºSPIʼþ´¦Àíº¯Êý
** ²Î Êý£ºÎÞ
** ·µ»ØÖµ£ºÎÞ
******************************************************************************/
void spi_event_handler(nrf_drv_spi_evt_t const * p_event,
void * p_context)
{
//
spi_xfer_done = true;
}
/*****************************************************************************
** Ãè Êö£ºÅäÖÃÓÃÓÚÇý¶¯ADS1255µÄ¹Ü½Å
** Èë ²Î£ºÎÞ
** ·µ»ØÖµ£ºÎÞ
******************************************************************************/
void SPI0_Init(void)
{
//
nrf_gpio_cfg_output(SPI_SS_PIN);
//
SPI0_CS_HIGH;
//
nrf_drv_spi_config_t spi_config = NRF_ADS1255_SPI0_CFG;
//
// spi_config.ss_pin = NRF_DRV_SPI_PIN_NOT_USED;
// spi_config.miso_pin = SPI_MISO_PIN;
// spi_config.mosi_pin = SPI_MOSI_PIN;
// spi_config.sck_pin = SPI_SCK_PIN;
//³õʼ»¯SPI
APP_ERROR_CHECK(nrf_drv_spi_init(&SPI0, &spi_config, NULL, NULL));
}
//ADS1255¶Á¼Ä´æÆ÷
uint8_t ADS1255_Read_REG(uint8_t Address)
{
char temp=0;
unsigned char i;
SPI0_CS_LOW;
for(i=0;i<10;i++){};
SPI_Receive_Send(SPI0,Address|ADS1255_RREG); //
nrf_delay_us(10);
//for(i=0;i<10;i++);
SPI_Receive_Send(SPI0,0x00); //
nrf_delay_us(10); //
temp = SPI_Receive_Send(SPI0,0x00);
return temp;
}
//ADS1255д¼Ä´æÆ÷
void ADS1255_Write_REG(uint8_t Address,uint8_t data)
{
unsigned char i;
uint8_t cmd[3]={0x00,0x00,0x00,};
SPI0_CS_LOW;
cmd[0]=ADS1255_WREG|Address;
cmd[1]=0x00;
cmd[2]=data;
for(i=0;i<10;i++);
SPI_Receive_Send(SPI0,cmd[0]); //
for(i=0;i<10;i++);
SPI_Receive_Send(SPI0,cmd[1]);
for(i=0;i<10;i++);
SPI_Receive_Send(SPI0,cmd[2]);
}
void ADS1255_Init(void) //ADS1255 ³õʼ»¯
{
SPI0_CS_LOW;
nrf_delay_us(100);
while(ADS_DRDY);
SPI_Receive_Send(SPI0,ADS1255_SELFCAL); //
SPI_Receive_Send(SPI0,ADS1255_RESET);
nrf_delay_us(10);
// while(ADS_DRDY);
// SPI_Receive_Send(SPI2,ADS1255_SYNC); //
// SPI_Receive_Send(SPI2,ADS1255_WAKEUP); //
while(ADS_DRDY); //
ADS1255_Write_REG(ADS1255_STATUS,0x00); //
// ADS1255_Write_REG(ADS1255_MUX,ADS1255_MUXP_AIN1|ADS1255_MUXN_AINCOM); //
ADS1255_Write_REG(ADS1255_ADCON,ADS1255_GAIN_1|0x20); //
ADS1255_Write_REG(ADS1255_DRATE,ADS1255_DRATE_7500SPS); //
ADS1255_Write_REG(ADS1255_IO,0x00); //
nrf_delay_us(100);
while(ADS_DRDY);
SPI_Receive_Send(SPI0,ADS1255_SELFCAL); //
SPI_Receive_Send(SPI0,ADS1255_SYSOCAL);
SPI_Receive_Send(SPI0,ADS1255_SYSGCAL);
SPI0_CS_HIGH;
nrf_delay_us(10);
}
/********************************************END FILE*******************************************/
(很抱歉没有注释,中文从keil复制过来全是乱码,我不得不把他们删掉)
主函数:
int main(void)
{
uint8_t cr;
gpio_output_voltage_setup_3v3();
log_init();
uart_config();
SPI0_Init();
printf("SPI0\n");
ADS1255_Init();
while(true)
{
// while (app_uart_get(&cr) != NRF_SUCCESS);
// while (app_uart_put(cr) != NRF_SUCCESS);
//printf("%c",cr);
cr = ADS1255_Read_REG(ADS1255_STATUS);
printf("%c",cr);
nrf_delay_ms(10);
// if(!ADS_DRDY)
// {
// SPI_Receive_Send(SPI0, 0x00);
// cr = SPI_Receive_Send(SPI0,0x00);
// printf("%c",cr);
// }
}
目前怀疑:
1、驱动代码有问题。
2、芯片坏了/焊接问题。但目前焊接了3块,症状均相同,概率很小。
3、pcb布局问题,但感觉布局的瑕疵不至于对数字信号产生致命影响。