主题中讨论的其他器件: ADS8166、 ADS8866
大家好、我在使用 ADS8867进行开发时遇到了一些问题、在 GPIO 模式和 SPI 模式下无法获得正确的 ADC 值。
1 /在 GPIO 模式中。
解决方案1.
GPIO 配置:
DIN:输出推挽模式、最大速度50m,高
CONVEST:输出推挽模式、最大速度50m
SCLK:输出推挽模式、最大速度50m
DOUT:输入模式,浮动输入
void bsp_adc_ads8867_init (void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.Mode = GPIO_MODE_OUTPSI_PP; GPIO_InitStructure.Speed = GPIO_SPED_FREQ_HIGH; GPIO_InitStructure.Pin = ADC_ADS867_PIN_SCK | ADC_ADS867_PIN_CNV; HAL_GPIO_Init (ADC_ADS867_GPIO_PORT、&GPIO_InitStructure); GPIO_InitStructure.Mode = GPIO_MODE_INPUT; GPIO_InitStructure.Speed = GPIO_SPED_FREQ_HIGH; GPIO_InitStructure.Pull = GPIO_PULLUDOWN; GPIO_InitStructure.Pin = ADC_ADS867_PIN_SDO; HAL_GPIO_Init (ADC_ADS867_GPIO_PORT、&GPIO_InitStructure); TCNV (0);//CONVEST 为低电平 TSCK (0);//SCLK 低 电平} uint16_t BSP_ADC_ads8867_read (void) { uint8_t i; uint16_t temp = 0; GPIO_InitTypeDef GPIO_InitStructure; TCNV (0);//CONVEST 为低电平 ADC_ADS867_CONV_LOW_DELAY ();//CONVEST 低延迟约为16ns TCNV (1);//CONVEST 高电平并进入转换阶段。 ADC_ADS867_CONV_HIGH_DELAY ();//CONVEST 高延迟约为6000ns 或12000ns TCNV (0);//CONVEST 为低电平 for (i=0;i<16;i++) { 温度<<= 1; TSCK (1);//SCLK 高电平 ADC_ADS867_SCLK_HIGH_DELAY ();//SCLK 高延迟48ns。 f(SCLK)< 16MHz。 TSCK (0);//SCLK 低 电平 IF (TSDO = 1)//读取 DOUT { temp |= 0x0001; } ADC_ADS867_SCLK_LOW_DELAY ();//SCLK 低延迟48ns.F(SCLK)< 16MHz 。} 返回温度; }
定时器2 ISR 函数中调用的 bsp_adc_ads8867_read()函数、定时器2的周期为1ms。
如果 CONVEST 高延迟约6000ns,我无法获得正确的 ADC 值、则所有 ADC 值均为零。
如果 CONVEST 高延迟约为12000ns、我可以获得正确的 ADC 值,但 ADC 值有时为零。
我在示波器上查看时序图、它看起来只有 SCLK 的下降沿、数据是故障和开始输出。
因此、我按如下方式更改代码、但仍然无法解决问题。
解决方案2.
uint16_t bsp_adc_ads8867_read (void) { uint8_t i; uint16_t temp = 0; TCNV (0);//CONVST 低电平 ADC_ADS867_CONV_LOW_DELAY ();//CONVST 低延迟约为16ns TCNV (1);//CONVST 高电平 ADC_ADS867_CONV_HIGH_DELAY ();//CONVST 高延迟约为12000ns /***** 为数据启动输出而下降**** / TSCK (1);//SCLK 高电平 ADC_ADS867_SCLK_HIGH_DELAY ();//SCLK 高延迟约为48ns.f (SCLK)< 16MHz。 /***** 为数据启动输出而下降**** / TCNV (0);//SCLK 为低电平 ADC_ADS867_CONV_LOW_DELAY ();//SCLK 低电平大约48ns。 f (SCLK)< 16MHz。 /***** 为数据启动输出而下降**** / TSCK (0); ADC_ADS867_SCLK_LOW_DELAY (); /***** 为数据启动输出而下降**** / for (i=0;i<16;i++) { temp <<= 1; TSCK (1);//SCLK Low if (TSDO = 1)//读取 DOUT { temp |= 0x0001; } ADC_ADS867_SCLK_HIGH_DELAY ();//SCLK 高延迟约为48ns.f (SCLK)< 16MHz。 TSCK (0);//SCLK 低电平 ADC_ADS867_SCLK_LOW_DELAY ();//SCLK 低延迟约为48ns.f (SCLK)< 16MHz 。} 返回温度; }
这个解决方案 我可以获得正确的 ADC 值,但 ADC 值有时为零。
我想知道在 GPIO 模式下是否错过任何内容?
2/SPI 模式
静态空 MX_SPI2_Init (空) { /* SPI1参数配置*/ hspi2.instance = SPI2; hspi2.Init.Mode = SPI_MODE_MASTER; hspi2.Init.Direction = SPI_Directure_2LINES_RXONLY; hspi2.Init.DataSize = SPI_DATASIZE_16BIT; //hspi2.Init.DataSize = SPI_DATASIZE _8bit; hspi2.Init.CLKPolarity = SPI_POLICY_HIGH; //hspi2.Init.CLKPolarity = SPI_POLICY_LOW; hspi2.Init.CLKPhase = SPI_PHASE_2EDGE; //hspi2.Init.CLKPhase = SPI_PHASE_1EDGE; hspi2.Init.nss = SPI_NSS_soft; //hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;//SPI = 8M hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi2.Init.TIMode = SPI_TIMDE_DISABLE; hspi2.Init.CRCCalcirc= SPI_CRCCALCULATION_DISABLE; hspi2.Init.CRCPolynomial = 7; if (HAL_SPI_Init (&hspi2)!= HAL_OK) { _Error_Handler (__file__、__line__); } } void HAL_SPI_MspInit (SPI_HandleTypeDef* hspi) { GPIO_InitTypeDef GPIO_InitStruct; #if 1//for_ad_SPI if (hspi->instance=SPI2) { //用户代码开头 SPI1_MspInit 0 *// ////用户代码结尾 SPI1_MspInit 0 * /*外设时钟启用*/ _HAL_RCC_SPI2_CLK_ENABLE (); /** SPI2 GPIO 配置 Pb12. ---- >SPI2_NSS Pb13. ---- > SPI2_SCK PB14. ---- > SPI2_MISO PB15. ---- > SPI2_MOSI * GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_15; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPED_FREQ_HIGH; HAL_GPIO_Init (GPIOB、&GPIO_InitStructt); GPIO_InitStruct.Pin = GPIO_PIN_14; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init (GPIOB、&GPIO_InitStructt); /*用户代码开始 SPI1_MspInit 1 */ /*用户代码结束 SPI1_MspInit 1 */ } #endif } void BSP_ADC_ads8867_init (void) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.Mode = GPIO_MODE_OUTPSI_PP; GPIO_InitStructure.Speed = GPIO_SPED_FREQ_HIGH; GPIO_InitStructure.Pin = ADC_ADS867_PIN_CNV | ADC_ADS867_PIN_DIN; HAL_GPIO_Init (ADC_ADS867_GPIO_PORT、&GPIO_InitStructure); TCNV (0); tDIN (1); } uint16_t bsp_adc_ads8867_read (void) { uint8_t i; uint16_t temp = 0; GPIO_InitTypeDef GPIO_InitStructure; HAL_StatusTypeDef ERR_code = HAL_OK; uint8_t DATA[2]; TCNV (0); ADC_ADS867_CONV_LOW_DELAY (); TCNV (1); ADC_ADS867_CONV_HIGH_DELAY (); TCNV (0); ERR_code = HAL_SPI_Receive (&hspi2、data、1、 1000);//SPI 接收 if (err_code!= HAL_OK) { Debug_by_LUOGF_printf (0、"[%d][%s][err_code =%d]\r\n"、__line__、__function__、err_code); } temp =(uint16_t)((data[0]<<8)|(data[1]<0) ;return temp }
定时器2 ISR 函数中调用的 bsp_adc_ads8867_read()函数、定时器2的周期为1ms。
在 SPI 模式0和 SPI 模式3中、ADC 值不正确、ADC 值不等于零。
我想知道在 SPI 模式下是否错过任何内容?
此致。