尊敬的所有人:
我正在尝试从 MCU 上的 ADS8691获取转换的信号。
它似乎执行 ADC 的复位和基本通信、但是在寄存器设置中、为了获得准确的转换数据、似乎存在问题。
我在进入固件中的环路之前设置寄存器、示波器波形看起来正常。 然而、当调用采样率为每秒16、384的转换值时、SPI 通信波形看起来异常。
我在初始寄存器设置中设置器件地址和 ADC 输入范围、并在数据表的表6中设置 DATAOUT_CTL_REG 的值、以便在输出数据字中检查这些值。 (DATAOUT_CTL_REG 的值为0x5508)
观察到与输出数据字相对应的 SPI 通信波形后、确认转换结果后的标志值无法正常读取。
此外、还确认转换结果值与初始 ADC 输入范围寄存器值相同、不会输出。 并确认转换结果值的范围与初始设置寄存器值(0000b)相对应、而不是 ADC 输入范围寄存器设置的值。
转换结果后 ADC 输入范围[5:2]的位值似乎不规则、并且之前设置的器件地址值不显示。
我附加了 C 代码和 示波器屏幕截图。
如果您对此 ADC 有任何经验、请告知我出错了。
如果您有一个与此 ADC 或 ADC 以相同方式运行的 C 代码示例、您会与我分享吗? 请将其发送至 midoh.in.here@gmail.com。
======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== //
#include "main.h"
#include "stm32f7xx_hal.h"
#include "dma.h"
#include "spi.h"
#include "TIM.h"
#include "USART.h"
#include "gpio.h"
/*用户代码 begin 包括*/
#define CLEAR_HWORD 0x6000
#define READ_HWORD 0xC800
#define 读取 0x4800
#define WRITE 0xD000
#define WRITE_MS 0xD200
#define WRITE_LS 0xD400
#define SET_HWORD 0xD800
#define DEVICE_ID_REG 0x02 //器件 ID 寄存器
#define RST_PWRCTL_REG 0x04 //复位和电源控制寄存器
#define SDI_CTL_REG 0x08 // SDI 数据输入控制寄存器
#define SDO_CTL_REG 0x0C // SDO-x 数据输入控制寄存器
#define DATAOUT_CTL_REG 0x10 //输出数据控制寄存器
#define RANGE_SEL_REG 0x14 //输入范围选择控制寄存器
#define ALARM_REG 0x20 // ALARM 输出寄存器
#define ALARM_H_TH_REG 0x24 //警报高阈值和迟滞寄存器
#define ALARM_L_TH_REG 0x28 //警报低阈值寄存器
uint16_t ADC_Command = 0;
uint32_t ADC_Result = 0;
/*用户代码末尾包括*/
/*私有变量------------------------------------------------------- *
/*用户代码 begin PV */
/*私有变量------------------------------------------------------- *
extern uint8_t TIM7_Flag;
uint8_t SPI1_ADC_RxBuffer[8]={0};
uint8_t SPI1_ADC_TxBuffer[8]={0};
/*用户代码末尾 PV */
/*私有函数原型------------------------------------------------------- *
void SystemClock_Config (void);
静态空 MX_NVIC_Init (空);
/*用户代码 begin PFP */
/*私有函数原型------------------------------------------------------- *
/*用户代码末尾 PFP */
/*用户代码开始0 */
/*用户代码结束0 */
int main (空)
{
/*用户代码 begin 1 */
/*用户代码结束1 */
/* MCU 配置------------------------------------------------------- *
/*复位所有外设、初始化闪存接口和 SysTick。 *
HAL_Init();
/*用户代码 begin Init */
/*用户代码结束初始化*/
/*配置系统时钟*/
SystemClock_Config();
/*用户代码 begin sysinit */
/*用户代码结束 sysinit */
/*初始化所有已配置的外设*/
mx_GPIO_Init();
HAL_GPIO_WritePin (GPIOA、GPIO_PIN_4、GPIO_PIN_RESET); // SPI1_NSS 引脚变为低电平
HAL_GPIO_WritePin (GPIOA、GPIO_PIN_5、GPIO_PIN_RESET); // SPI1_SCK 引脚变为低电平
HAL_GPIO_WritePin (ADC_RST_GPIO_Port、ADC_RST_Pin、GPIO_PIN_RESET); // ADC 复位
HAL_DELAY (100);
HAL_GPIO_WritePin (ADC_RST_GPIO_Port、ADC_RST_Pin、GPIO_PIN_SET);
mx_dma_Init();
mx_SPI1_Init(); // SPI_CS 由硬件控制
mx_SPI4_Init();
MX_TIM6_Init();
MX_TIM7_Init();
mx_USART1_UART_Init();
/*初始化中断*/
mx_NVIC_Init();
HAL_TIM_Base_Start_IT (&htim7); //用于 ADC 采样
/*用户代码 begin 2 */
//////// 将器件地址设置为0x05
ADC_Command =写入+ DEVICE_ID_REG;
SPI1_ADC_TxBuffer[0]=(uint8_t)(ADC_Command >> 8);
SPI1_ADC_TxBuffer[1]=(uint8_t) ADC_Command;
SPI1_ADC_TxBuffer[2]= 0x00;
SPI1_ADC_TxBuffer[3]= 0x05;
HAL_SPI_Transmit _DMA (&hspi1、SPI1_ADC_TxBuffer、4);
while (hspi1.State == HAL_SPI_State_Busy_TX);
//------------------------------------------- //
//////// 设置 ADC 输入范围并禁用内部参考
ADC_Command =写入+ RANGE_SEL_REG;
SPI1_ADC_TxBuffer[0]=(uint8_t)(ADC_Command >> 8);
SPI1_ADC_TxBuffer[1]=(uint8_t) ADC_Command;
SPI1_ADC_TxBuffer[2]= 0x00;
//SPI1_ADC_TxBuffer[3]= 0x20; //±3V * Vref 和内部参考禁用
SPI1_ADC_TxBuffer[3]= 0x43; // ±1.25V * Vref 和内部参考禁用
HAL_SPI_Transmit _DMA (&hspi1、SPI1_ADC_TxBuffer、4);
while (hspi1.State == HAL_SPI_State_Busy_TX);
//------------------------------------------- //
//////// 设置 DATAOUT_CTL_REG 值与表6相同。 数据表中
ADC_Command =写入+ DATAOUT_CTL_REG;
SPI1_ADC_TxBuffer[0]=(uint8_t)(ADC_Command >> 8);
SPI1_ADC_TxBuffer[1]=(uint8_t) ADC_Command;
SPI1_ADC_TxBuffer[2]= 0x55;
SPI1_ADC_TxBuffer[3]= 0x08;
HAL_SPI_Transmit _DMA (&hspi1、SPI1_ADC_TxBuffer、4);
while (hspi1.State = HAL_SPI_State_Busy_TX);
//------------------------------------------- //
HAL_SPI_MspDeInit (&hspi1); //软件控制 SPI_CS
//====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
/*用户代码末尾2 */
/*无限循环*/
/*用户代码在*/时开始
while (1)
{
/*用户代码结束,同时*/
IF (TIM7_Flag) //由 Timer7启动的标志(16.384kHz)
{
HAL_GPIO_WritePin (GPIOA、GPIO_PIN_4、GPIO_PIN_SET); // SPI_CS 高电平
SPI1_ADC_RxBuffer[0]= 0; // CS 高电平保持和 RxBuffer Init
SPI1_ADC_RxBuffer[1]= 0; // CS 高电平保持和 RxBuffer Init
SPI1_ADC_RxBuffer[2]= 0; // CS 高电平保持和 RxBuffer Init
SPI1_ADC_RxBuffer[3]= 0; // CS 高电平保持和 RxBuffer Init
HAL_GPIO_WritePin (GPIOA、GPIO_PIN_4、GPIO_PIN_SET); // SPI_CS 高电平
HAL_GPIO_WritePin (GPIOA、GPIO_PIN_4、GPIO_PIN_RESET); // SPI_CS 低电平
HAL_SPI_Receive_DMA (&hspi1、SPI1_ADC_RxBuffer、4); //读取转换结果和所有数据标志。
// 提取转换结果
ADC_Result =(uint32_t)(SPI1_ADC_RxBuffer[0]<< 10);
ADC_Result = ADC_Result +(uint32_t)(SPI1_ADC_RxBuffer[1]<< 2);
ADC_Result = ADC_Result +(uint32_t)(SPI1_ADC_RxBuffer[2]>> 6);
TIM7_Flag = 0;
}
/*用户代码 begin 3 */
}
/*用户代码结束3 */
}
============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================






