无法从带有 STM42F411 的 ADS8686S 读取
Failing to read from an ADS8686S with an STM42F411
我正在尝试从 TI 的 ADS8686S ADC 读取寄存器。它具有以下寄存器读取时序图(来自https://www.ti.com/lit/ds/symlink/ads8686s.pdf?ts=1624204868114&ref_url=https%253A%252F%252Fwww.ti.com%252Fproduct%252FADS8686S):
设备寄存器为0x10,假定值为0x2002。
我有以下 SPI 初始化:
static void MX_SPI1_Init(void)
{
/* SPI1 parameter configuration*/
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 10;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
}
使用以下代码片段专门读取该寄存器:
// Read register device id (0x10 << 9) & 0xFF00
uint8_t tx[2] = { 0x20, 0x00 };
uint8_t rx[2] = { 0x00, 0x00 };
// Send read register command
set_adc_cs(GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(&hspi1, tx, rx, 2, 1000);
set_adc_cs(GPIO_PIN_SET);
// Don't care
HAL_SPI_TransmitReceive(&hspi1, tx, rx, 2, 1000);
// Receive register result
set_adc_cs(GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(&hspi1, tx, rx, 2, 1000);
set_adc_cs(GPIO_PIN_SET);
我读回 rx 为 { 0x00, 0x02}。几乎就像我得到了一半的寄存器。只是现在真的不确定这个问题,一直在用头撞墙。
是我的SPI设置问题,还是我看错时序图了?
它说必须设置第 15 位才能读取。你已经很清楚了。尝试:
uint8_t tx[2] = { 0xA0, 0x00 };
我的代码运行良好。我从 TI 那里得到确认,数据表中的复位值不正确,因为它们包含地址,该地址未回读。
我正在尝试从 TI 的 ADS8686S ADC 读取寄存器。它具有以下寄存器读取时序图(来自https://www.ti.com/lit/ds/symlink/ads8686s.pdf?ts=1624204868114&ref_url=https%253A%252F%252Fwww.ti.com%252Fproduct%252FADS8686S):
设备寄存器为0x10,假定值为0x2002。
我有以下 SPI 初始化:
static void MX_SPI1_Init(void)
{
/* SPI1 parameter configuration*/
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 10;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
}
使用以下代码片段专门读取该寄存器:
// Read register device id (0x10 << 9) & 0xFF00
uint8_t tx[2] = { 0x20, 0x00 };
uint8_t rx[2] = { 0x00, 0x00 };
// Send read register command
set_adc_cs(GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(&hspi1, tx, rx, 2, 1000);
set_adc_cs(GPIO_PIN_SET);
// Don't care
HAL_SPI_TransmitReceive(&hspi1, tx, rx, 2, 1000);
// Receive register result
set_adc_cs(GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(&hspi1, tx, rx, 2, 1000);
set_adc_cs(GPIO_PIN_SET);
我读回 rx 为 { 0x00, 0x02}。几乎就像我得到了一半的寄存器。只是现在真的不确定这个问题,一直在用头撞墙。
是我的SPI设置问题,还是我看错时序图了?
它说必须设置第 15 位才能读取。你已经很清楚了。尝试:
uint8_t tx[2] = { 0xA0, 0x00 };
我的代码运行良好。我从 TI 那里得到确认,数据表中的复位值不正确,因为它们包含地址,该地址未回读。