主题中讨论的其他器件:ADS1248
主要问题:我已拔下/插入与 ADS1248EVM 板相连的 USB 电缆几次、浏览器插件指示灯似乎检测到 ADS1248EVM 板、因为它亮起红色、但重复报告"器件已断开连接"。
以下是我加载的驱动程序文件、请告知它们是否正确。


This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
主要问题:我已拔下/插入与 ADS1248EVM 板相连的 USB 电缆几次、浏览器插件指示灯似乎检测到 ADS1248EVM 板、因为它亮起红色、但重复报告"器件已断开连接"。
以下是我加载的驱动程序文件、请告知它们是否正确。


这是我将用于 ADS1248EVM 电路板的 Windows 驱动程序。
https://www.ti.com/tool/download/SBAC253
此驱动程序是否支持 Windows 11?
我使用的是最新的 Chrome Web 浏览器、Chrome 应该为
https://dev.ti.com/gallery/view/PADC/ADS1x48EVM_GUI
正常运行?
尊敬的 Tim:
关闭自述文件后可以显示 GUI 页面吗? 如果存在驱动程序问题、应该会出现另一个弹出框、解释 GUI 无法连接的原因。 驱动程序应该自动安装。 似乎您有批量驱动程序、但 EVM 也会枚举为 CDC。 因此、在设备管理器中、应该同时为 EVM 分配了 USB Bulk 和 COM 端口。 这两个驱动程序实际上都是 MS-OS 本机的,应自动安装。 但是使用下载也应该能够正确地分配它们。
对于 EVM、请确保两个板的方向正确。 在底板上、你看到有灯点亮了吗?你能否告诉我哪些灯点亮了(如果你想连接它、图片也会提供帮助)?
谢谢。
鲍勃 B
尊敬的 Tim:
可以、您可以断开两个电路板的连接并使用不同的微控制器。 DVDD 和 AVDD 电源都必须处于标称电压、RESET 引脚被拉高、START 引脚被拉高以读取和写入寄存器(请参阅数据表中表19下的注释)。
此外、如果使用 CS、则需要在整个通信事务中保持低电平。 如果 CS 在字节之间切换、则每次 CS 变为高电平时、通信都将取消。 通常、这要求 CS 由 GPIO 控制。
此致、
鲍勃 B
尊敬的 Tim:
我建议将 START 引脚设置为高电平、并通过监控 DRDY 来查看输出是否以默认数据输出速率脉冲、从而查看器件是否处于活动状态。 如果不是、则需要重新检查连接、主要是+5V、+3.3V、GND、复位和启动。
如果 DRDY 会产生脉冲、则器件处于运行状态。 布线可能是个问题、但我看到了很多更糟糕的问题、因此您应该能够进行通信。 通过示波器检查 SCLK、DIN 和 DOUT 的信号完整性。 确保 Micro SPI OUT 位于 DIN 上、DOUT 连接到 Micro SPI IN。
如果仍有问题、请向我发送通信的一些示波器或逻辑分析仪快照、以帮助进行故障排除。
此致、
鲍勃 B
Bob 您好!
继续感谢你的全力支持。
下面是我为使 ADS1248退出复位而编写的一个简短而简单的测试
写入其寄存器以设置 ADC 转换并读回寄存器值
(MUX0)以查看我的其中一个 Reg 配置设置是否已正确写入。
我将抓取另一个示波器探头并显示 SCLK、D_IN 和 D_OUT。
时间
#define ADC1248_RREG_CMD 0x20
#define ADC1248_WREG_CMD 0x40
void RTD_NumReg (uint8_t uRegNum、uint8_t Read_Reg)
{
uint8_t ADC1248_CMD [15 + 2]={0};
uint8_t ADC1248_MISO [15 + 2 ];
INT n = 0、I =0;
memset (ADC1248_MISO、0、sizeof (ADC1248_MISO));
ADC1248_CMD [ 0 ]=( ADC1248_RREG_CMD | uRegNum );
ADC1248_CMD [ 1 ]= uNumReg;
if (HAL_SPI_TransmitReceive (&hspi5、(uint8_t*) ADC1248_CMD、(uint8_t *) ADC1248_MISO、(uNumReg + 1)、5000)!= HAL_OK)
{
Error_Handler ();
}
HAL_DELAY (10);
}
void RTD_Val (uint8_t uRegNum、uint8_t Write_Reg)
{
uint8_t ADC1248_CMD [15 + 2]={0};
uint8_t ADC1248_MISO [15 + 2 ];
ADC1248_CMD [ 0 ]=( ADC1248_WREG_CMD | uRegNum );
ADC1248_CMD [ 1 ]= 0;
ADC1248_CMD [ 2 ]= uRegVal;
if (HAL_SPI_TransmitReceive (&hspi5、(uint8_t*) ADC1248_CMD、(uint8_t *) ADC1248_MISO、35000)!= HAL_OK)
{
// debug_printf ("ADS1248 RTD_ADC_ Write_Reg failure!!!\r\n");
//debug_printf ("ADS1248 stopped.\r\n");
while (1);
}
HAL_DELAY (10);
//debug_printf ("ADS1248 RTD_VAL:%s、Write_Reg:%.2xh\r\n"、ADS1248_reg_names[uRegNum]、uRegVal");
}
int ADS1248_Init (void)
{
HAL_GPIO_WritePin (RTD_nRESET_GPIO_Port、RTD_nRESET_Pin、0);
HAL_DELAY (60);
HAL_GPIO_WritePin (RTD_nRESET_GPIO_Port、RTD_nRESET_Pin、1);
HAL_DELAY (600);
//debug_printf ("ADS1248:重置结束\r\n ");
HAL_GPIO_WritePin (RTD_START_GPIO_Port、RTD_START_Pin、1);
HAL_GPIO_WritePin (RTD_nCS_GPIO_Port、RTD_nCS_Pin、0);
HAL_DELAY ( 600 );
RTD_MUX Write_Reg ( MUX0 ,(MUX_SP2_AIN2| MUX_SN2_AIN3));
RTD_VBIAS( Write_Reg ,(VBIAS_3| VBIAS_2 ));
RTD_REF0 Write_Reg (MUX1,(REFSELT1_REF0 | MUXCAL2_REF0 ));
RTD_SYS0 ( Write_Reg ,(PGA2_0| DOR3_1000));
RTD_OFC0 (Write_Reg 0、0x01);
RTD_PIN (IDAC0、Write_Reg);
RTD_IDAC1 (Write_Reg、0xCC);
RTD_GPIOCFG ( Write_Reg , CFG_ANALOG_INPUT_MODE );
RTD_GPIODIR (Write_Reg,0);
RTD_GPIODAT (Write_Reg,0);
返回0;
}
int main (空)
{
ADS1248_Init ();
while (1)
{
RTD_MUX Write_Reg ( MUX0 ,(MUX_SP2_AIN2| MUX_SN2_AIN3));
RTD_MUX0 Read_Reg (MUX0,1 );
HAL_DELAY (1000);
}
返回0;
}
我只是调用 init 函数来重置芯片、并 将 nRESET、 nCS、开始 为高电平。
然后将0xFF 写入寄存器 MUX0。 断点在 Write_Reg 函数中的 HAL_SPI_TransmitReceive 后立即设定:
if (HAL_SPI_TransmitReceive (&hspi5、(uint8_t*) ADC1248_CMD、(uint8_t *) ADC1248_MISO、35000)!= HAL_OK)
ADS1248_Init ()
{
HAL_GPIO_WritePin (RTD_nRESET_GPIO_Port、RTD_nRESET_Pin、0);
HAL_DELAY (60);
HAL_GPIO_WritePin (RTD_nRESET_GPIO_Port、RTD_nRESET_Pin、1);
HAL_DELAY (600);
//debug_printf ("ADS1248:重置结束\r\n ");
HAL_GPIO_WritePin (RTD_START_GPIO_Port、RTD_START_Pin、1);
HAL_GPIO_WritePin (RTD_nCS_GPIO_Port、RTD_nCS_Pin、0);
返回0;
}
RTD_MUX0 (Write_Reg、0xFF);

尊敬的 Tim:
遗憾的是、我没有看到全部24个 SCLK、但我可以从数据的开始位置进行猜测。 使用 FF 向 MUX0写入寄存器需要写入寄存器命令(0x40 +寄存器位置(MUX0 =地址0x00))+要写入的寄存器数量减去一(一个寄存器为0x00) +数据(0xFF)。 除了 SPI DIN 必须在 SCLK 的上升沿发生变化并在下降沿保持稳定外、它看起来就像在做的那样。 因此、您将需要更改 SCLK 的相位设置。
此致、
鲍勃 B
我显示了我正在将0xFF 写入 MUX0、然后再读回它。 我在 WReg ()和 RReg ()函数中放置一个断点以捕获此值。
我从未看到 RReg 中的数据缓冲区随0xFF 返回、它是0x00、0x33或0x80。
那么、是的、我的定义为:
#define ADC1248_RDTA_CMD ( 0x12 )
#define ADC1248_RREG_CMD (0x20)
#define ADC1248_WREG_CMD ( 0x40 )
#define ADC1248_NOPR_CMD ( 0xFF )
具体代码为:
RTD_MUX0 (Write_Reg、0xFF);
RTD_MUX0 Read_Reg (MUX0,1 );
SPI 设置:


尊敬的 Tim:
您必须查看处理器的数据表、以了解 CPHA 应为0还是1。 由于示波器屏幕截图上当前是错误的、并且您使用的是1、因此它必须为0。
就通信而言、您必须在发送/接收功能中向外设发送错误数据。 无论您是使用 RREG 还是 WREG 命令、都应始终有24个 SCLK。 前两个字节是命令、最后一个字节是数据。 因此数据应始终传输3个字节。 这意味着对于 RREG 命令、您需要发送两个命令字节(0x20 0x00)和一个 NOP (0xFF)。 由于您不发送 NOP、因此从不会发送 SCLK 的最后一个字节(会产生16个 SCLK 而不是24个 SCLK)。 在内部、写入发送缓冲器会启动 SCLK。
对于寄存器数据、内容将位于数组 ADC1248_MISO[]的第3个字节中。
在再次查看您的代码后、我认为我看到了问题。
void RTD_Read_Reg ( uint8_t uRegNum, uint8_t uNumReg )
{
uint8_t ADC1248_CMD [ 15 + 2] = { 0 };
uint8_t ADC1248_MISO [ 15 + 2 ];
int n = 0, i =0;
memset ( ADC1248_MISO, 0, sizeof(ADC1248_MISO));
ADC1248_CMD [ 0 ] = ( ADC1248_RREG_CMD | uRegNum ); // this is ok
ADC1248_CMD [ 1 ] = uNumReg; // This should be number of registers less 1 so when reading 1 register it shoudl be 0
// you also need to send the NOP
ADC1248_CMD [ 2 ] = 0xFF;
// If uNumReg value is requesting more than one byte of data then you need to send additional NOPs
// For example, the RDATA command to read back conversion results is the command and three bytes of data for a total of 4 bytes transmitted
// The following is incorrect for the number of bytes as you are giving uNumReg + 1
// If the uNumReg = 1, then for reading back 1 register you need to add 2 so that 3 bytes are sent (2 command bytes + NOP)
if (HAL_SPI_TransmitReceive(&hspi5, (uint8_t*)ADC1248_CMD, (uint8_t *)ADC1248_MISO, (uNumReg + 1), 5000) != HAL_OK )
{
Error_Handler();
}
HAL_Delay (10);
}
此致、
鲍勃 B