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.
你好、Gokul、
欢迎访问 TI E2E 论坛!
您是否能够从任何 ADS1256器件寄存器中读取和写入数据、或者您面临的主要问题与对 STM MCU 上的 SPI 外设进行编程有关?
遗憾的是、我不熟悉该 MCU、也无法帮助处理与微控制器具体相关的代码; 但是、如果 SPI 外设正常工作并向 ADS1256发送命令、我当然可以评论与 ADC 通信的接口代码。
您是否曾尝试探测示波器或逻辑分析仪上的 SPI 信号以验证 HAL_GPIO_WritePin ()或 HAL_SPI_Transmit ()命令是否按预期工作?
请随时与我分享这些屏幕截图中的任何一个、我将了解我是否可以帮助您解决 SPI 通信问题。
供参考:您共享的代码似乎已被截断...我没有看到 ADC_READ()函数的末尾。 您可以随意分享代码的其余部分、我将查看它以查看是否可以发现任何问题。
尊敬的 Hall:
我的 SPI 外设工作正常、我只在发送和接收 ADC 上的字节时遇到问题。 我不知道问题在哪里。 我已共享代码并进行验证
/* USER CODE BEGIN Header */** (用户代码开始标头 *@文件 :main.c *@简介 主要方案机构 *@注意 ** *此软件组件由 ST 根据 BSD 3-Clause 许可证 *"许可证"获得许可;除非符合 *许可证、否则您不能使用此文件。 您可以在 以下网址获得许可证副本:* opensource.org/licenses/BSD-3-Clause * */ /*用户代码结尾标头*/ /*包括------------------------------------------------------- */ #include "main.h" /* private 包括------------------------------------------------------- */ /*用户代码开始包括*/ /*用户代码结束包括*/ /*私有 typedef ------------------------------------------------------- */ /*用户代码 begin PTD */ uint8_t receive[2]; /*用户代码 end PTD */ /* private define ------------------------------------------------------- */ /*用户代码 begin pd */ /*用户代码 end PD */ /*私有宏------------------------------------------------------- */ /*用户代码 begin PM */ /*用户代码 end PM */ /*私有变量------------------------------------------------------- */ SPI_HandleTypeDef hspi3; UART_HandleTypeDef huart2; /*用户代码 begin PV */ *用户代码 end PV */ /*私有函数原型--- // void SystemClock_Config (void); static void MX_GPIO_Init (void); static void MX_SPI3_Init (void); static void MX_USART2_UART_Init (void); //用户代码 begin PFP */ void ADC_write (uint8_t address、uint8_t value) { uint8_t data[3]; 数据[0]= 0x50|地址; 数据[1]= 0x00; DATA[2]=值; HAL_GPIO_WritePin (GPIOC、CHIP_SELECT_Pin、GPIO_PIN_RESET); HAL_SPI_transmit (&hspi3、data、3、50); //DWT_DELAY (10); HAL_DELAY (1); HAL_GPIO_WritePin (GPIOC、CHIP_SELECT_Pin、GPIO_PIN_SET); } void ADC_WRITE_COMMAND (uint8_t 命令) { HAL_GPIO_WritePin (GPIOC、CHIP_SELECT_Pin、GPIO_PIN_RESET); HAL_SPI_transmit (&hspi3、&command、1、50); HAL_DELAY (1); HAL_GPIO_WritePin (GPIOC、CHIP_SELECT_Pin、GPIO_PIN_SET); } // float freq (float volta) { int 值= 0、TIM_val[100]; 浮点频率; for (int i=0;i<100;i++) { if (volta<0.1 && volta>0) { //启动计时器 while (!(volta<0.1 && volta>0); //停止计时器 } //TIM_val[i]= timercount_value; 值+= TIM_val[i]; } 值=值/100; 值=值*2; 频率= 1/值; 返回频率; } */ int adc_read() { uint8_t datacon; uint32_t convert = 0x00; HAL_GPIO_WritePin (GPIOC、CHIP_SELECT_Pin、GPIO_PIN_RESET); ADC_WRITE_COMMAND (0x01);//读取 for (int i=0;i<3;i++) { HAL_SPI_Receive (&hspi3、&datacon、1、50); convert |= datacon; convert<<=8; } //DWT_DELAY (10); HAL_DELAY (1); HAL_GPIO_WritePin (GPIOC、CHIP_SELECT_Pin、GPIO_PIN_SET); 返回转换; } 浮点电压(uint32_t data2) { float v; V =(float) data2*0.000000596046;// 8388607 =+5.000v 基准电压 返回 v; } void adc_read_regis (uint8_t 地址1) { uint8_t data1[3]; Data1[0]= 0x10|地址1; Data1[1]= 0x00; HAL_GPIO_WritePin (GPIOC、CHIP_SELECT_Pin、GPIO_PIN_RESET); HAL_SPI_transmit (&hspi3、data1、2、50); HAL_DELAY (5); HAL_SPI_Receive (&hspi3、&data1[2]、1、50); //DWT_DELAY (10); HAL_DELAY (1); HAL_GPIO_WritePin (GPIOC、CHIP_SELECT_Pin、GPIO_PIN_SET); } void ADC_RESET () { HAL_GPIO_WritePin (GPIOC、CHIP_SELECT_Pin、GPIO_PIN_RESET); HAL_GPIO_WritePin (GPIOC、RESET_Pin、GPIO_PIN_RESET); HAL_DELAY (1); HAL_GPIO_WritePin (GPIOC、RESET_Pin、GPIO_PIN_SET); HAL_GPIO_WritePin (GPIOC、CHIP_SELECT_Pin、GPIO_PIN_SET); } void ADC_init () { ADC_WRITE (0x00、0x03);//status ADC_WRITE (0x02、0x20);//adcon ADC_WRITE (0x03、0x82);//drate 100sps ADC_READ_Regis (0x03);//验证 ADC_WRITE_COMMAND (0xF0);// ADC 的自 CAB ADC_WRITE (0x01、0x0F);//通道0正极多路复用 ADC_WRITE_COMMAND (0xFC);//同步 ADC_WRITE_COMMAND (0x00);//唤醒 HAL_DELAY (500); }//* 用户代码 END PFP */* 专用用户代码------------------------------------------------------- */ /*用户代码开始0 */ /*用户代码结束0 */ /** @短于应用程序入口点。 *@retval int */ int main (void) { //用户代码 begin 1 */ uint32_t adc_data_ch0、adc_data_ch1; float VOLTGE_CH0、VOLTGE_CH1; /*用户代码结束1 */ /* MCU 配置------------------------------------------------------- // //*复位所有外设,初始化闪存接口和 SysTick。 */ HAL_Init(); //用户代码 begin Init */ //*用户代码 end Init */ //*配置系统时钟*/ SystemClock_Config(); //*用户代码 begin sysinit */ //*用户代码 end sysinit *// //////*初始化所有已配置的外设*/ MX_GPIO_Init ();MX_SPIIT */* UART2_Init (*;USART2_Init) HAL_GPIO_WritePin (GPIOC、CHIP_SELECT_Pin、GPIO_PIN_RESET); ADC_RESET (); HAL_DELAY (500); MX_SPI3_Init (); HAL_DELAY (500); ADC_WRITE_COMMAND (0xFE);//复位以加电值 ADC_WRITE_COMMAND (0xFC);//同步 ADC_WRITE_COMMAND (0x00);//唤醒 // DWT_DELAY (10); HAL_INIT (1 ); HAL_GPIO_WritePin (LD2_GPIO_Port、LD2_Pin、GPIO_PIN_SET);//确认配置 MX_USART2_UART_Init(); HAL_GPIO_WritePin (GPIOC、 CHIP_SELECT_Pin、GPIO_PIN_RESET); //while (HAL_GPIO_ReadPin (DRDY_GPIO_Port、DRDY_Pin)); ADC_WRITE (0x01、0x1F);// CH1正通道的多路复用器 ADC_WRITE_COMMAND (0xFC);//同步 ADC_WRITE_COMMAND (0x00);//唤醒 adc_data_ch0 = adc_read (); VOLTGE_CH0 =伏特(ADC_DATA_CH0); //while (HAL_GPIO_ReadPin (DRDY_GPIO_Port、DRDY_Pin)); ADC_WRITE (0x01、0x0F);//mux 用于 ch0正通道 ADC_WRITE_COMMAND (0xFC);//同步 ADC_WRITE_COMMAND (0x00);//唤醒 ADC_DATA_CH1 = ADC_READ (); VOLTGE_CH1 = VOLT (ADC_DATA_CH1); //frequency _in_ch1 = freq (volte_in_ch1); //*用户代码结束2 *// //*无限循环*// //*用户代码在*/ while (1) { HAL_DELAY (100); HAL_DELAY (100); HAL_GPIO_WritePin (GPIOC、CHIP_SELECT_Pin、GPIO_PIN_SET); } /*用户代码结束,同时*/ /*用户代码开始3 */ *用户代码结束3 */ } //* @系统时钟配置* @retval 无 */ void SystemClock_Config (void) { RCC_OscInitTypeDef RCC_OscillitStructure={0}; RCC_ClkInitTypeDef RCC_ClkInitSStructure={RCC_Oscit_Structure_RIC_Rag_RIC_RIC_RIT_RITH ={0}* RCC_Structure_RIC_RIC_RIT_RIT_RITH ={REC_RIT_RIT_RIT_RIT_RITH ={0}* RCP_RITIC_RITH ={REC_RIT_RITH RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL8; IF (HAL_RCC_OscConfig (&RCC_OscInitStructt)!= HAL_OK) { ERROR_Handler (); }/** 初始化 CPU、AHB 和 APB 总线时钟 */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKd = RCC_SYSCLCD_CLKDIV1 ;RCC_CLKCLKCLKCLKDIV1 = RCC_CLKCLK1;RCC_CLKCLKCLKCLKCLKCLKCLKDIVDD_CLK_CLKCLK_CLKCLK_CLKCLKCLK_CLK_CLKCLK_CLK_CLK_CLKDIVDD.CLK_CLK_CLK_CLKCLK if (HAL_RCC_ClockConfig (&RCC_ClkInitStruct, flash_latit_1)!= HAL_OK) { ERROR_Handler(); } }/** *@SPI3初始化函数* @param None *@retval None */ static void MX_SPI3_Init (void) { //*用户代码 begin SPI3_Init 0 *// ////*用户代码 end SPI3_Init 0 *// //////* 用户代码 begin SPI3_Init 1 */*配置 参数1 * SPI3_Init 1 * SPI3_Init 1 * hspi3.instance = SPI3; hspi3.Init.Mode = SPI_MODE_MASTER; hspi3.Init.DIRECTION = SPI_DIRECTION 2LINES; hspi3.Init.DataSize = SPI_DATASIZE_8bit; hspi3.Init.CLKPolarity = SPI_POLIT_LOW; hspi3.Init.CLKPhase = SPI_PHASE_1EDGE; hspi3.Init.NSS = SPI_NSS_Soft; hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; hspi3.Init.FirstBit = SPI_FIRSTBIT_BAUDAD_TIOTDE_16;hTIMESCAST_INIT_INIT_DITIDT_DITIDT3_DITIDT_DIT_DITDIT_DITIDT_B; hspi3.Init.CRCalaculy = SPI_CRCCALLion_disable; hspi3.Init.CRCPolynomial = 7; hspi3.Init.CRCCLhelength = SPI_CRC_LENGTH_DATAZE; hspi3.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; if (_HAL = 3)(INOK_HAL! ERROR_Handler(); } //*用户代码 begin SPI3_Init 2 *// //*用户代码 end SPI3_Init 2 */ } //* @简要 USART2初始化函数 *@param 无 *@retval 无 */ static void MX_USART2_UART_Init (void) { //*用户代码 begin USART2_Init 0 */ */*用户代码 begin USART2_Init 0* USART2_Init 1 */ /*用户代码结束 USART2_Init 1 */ huart2.instance = USART2; huart2.Init.baudate = 38400; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.stopbits = UART_stopartbits 1;uart2.none_parity = UART2_inuart.inuit_parity = UART2.none 奇偶校验;UART2_ huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_none; huart2.Init.overSAMPLING = UART_OPAMPLING_16; huart2.Init.INIT_ONE_SAMPLE_DISABLE;huart2.Advature_INDIAG_INT_UARTDIAT_INIFT_UART_INFEDVIFT_INT_INIT_INIFT_INIT_INIFT_INIT_IN if (HAL_UART_Init(&huart2)!= HAL_OK) { ERROR_Handler (); } //用户代码开头 USART2_Init 2 */ //*用户代码结束 USART2_Init 2 */ } //* @简单 GPIO 初始化函数 *@param None *@retval None */ static void MX_GPIO_Init (void) { GPIO_InitTypeDef GPIO_InitStruct** param None *; _ gpio_cl_clar_cl_clock_enable*=_ GPIO_r_clar_clock_enable_gpet_gpet (*);_ GPIO_en_cl_cl_cl_clar_cl_cl_clar_clar_clar_cl_cl_cl_clar_clock_en_clock_clock_enable_clock_clock_enable_ /*配置 GPIO 引脚输出电平*/ HAL_GPIO_WritePin (LD2_GPIO_Port、LD2_Pin、GPIO_PIN_RESET); /*配置 GPIO 引脚输出电平*/ HAL_GPIO_WritePin (GPIO,RESET_PING_PUT_PUT_PUT_SET); /*配置 GPIO 引脚:HAL_INIT_B1_INIT_GPIO_InStructure_GPIO_Infor_GPIO_PUT_GPIO_P=InStructure.GPIO_Infor_GPIO_PUT_Infor_GPIO_PUT_GPIO_P=GPIO_P=GPIO_InStructure.GPIO_Infor_Infor_GPIO_P=GPIO_P=GPIO_InStruct.GPIO_B1 ; /*配置 GPIO 引脚:LD2_Pin */ GPIO_InitStruct.Pin = LD2_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTP_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;GPIO_InIT_GPIO_LIT_GPIO_GPIO_InPort (GPIO_GPIO_GPIO_INIT_InPort_GPIO_GPIO_GPIO_GPIO_GPIO_GPIO_In结构) &GPIO_InitStruct); /*配置 GPIO 引脚:DRDY_Pin */ GPIO_InitStruct.Pin = DRDY_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init (DRDY_结构);GPIO_InStruct_Port;&GPIO_In结构 化 GPIO /*配置 GPIO 引脚:RESET_Pin CHIP_SELECT_Pin */ GPIO_InitStruct.Pin = RESET_PIN|CHIP_SELECT_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTP_PP; GPIO_InitStruct.Pull = GPIO_InitSlic.Speed = GPIO_InIT_LOW;GPIO_Q_低速 &GPIO_InitStruct); }//* 用户代码开始4 */ //*用户代码结束4 */ /** @简短如果发生错误,则执行此函数。 *@retval None */ void Error_Handler (void) { //*用户代码 begin Error_Handler_debug */ //*用户可以添加自己的实现来报告 HAL 错误返回状态*/ //*用户代码 end Error_Handler_debug */ } #ifdef use_full_assert // *@brief 报告源文件和源文件的名称 行号 * 发生了 assert_param 错误的位置。 *@param 文件:指向源文件名的指针 *@param 行:assert_param 错误行源编号 *@retval 无 */ void assert_failed (char *文件、uint32_t 行) { //*用户代码 begin 6 *// //*用户可以添加自己的实现来报告文件名和行号, TEX:printf ("错误的参数值:第%d\r\n"行上的文件%s、文件、行)*/ //*用户代码结束6 */ } #endif //* use_full_assert *
版权所有(c) 2019 STMicroelectronics。 *保留所有权利。
你好、Gokul、
请参阅下面的代码片段中的注释:
int adc_read () { uint8_t datacon; uint32_t convert = 0x00;// TODO:考虑将此设为有符号32位值、因为 ADC 数据是有符号 HAL_GPIO_WritePin (GPIOC、CHIP_SELECT_Pin、GPIO_PIN_RESET); // TODO: 在这里插入一个短延迟(在/CS 低电平和第一个 SCLK 之间)、 //除非 HAL_GPIO_WritePin ()已经提供了足够的延迟来满足 ADS1235的"T3"时序要求。 ADC_WRITE_COMMAND (0x01);//待办事项:发送此字节后不要将/CS 设置为高电平! // TODO:在此处插入短延迟以满足"T6"时序要求 //注意:某些 MCU 使用 FIFO 来存储来自 SPI 外设的 MISO 数据。 在调用 HAL_SPI_Receive ()之前、请确保已清除此 FIFO //、否则、来自前一个"0x01"命令的无关返回字节可能会被误解为数据。 for (int i=0;i<3;i++) { // TODO:发送一个"0x00字节"以时钟输出 ADC 数据字节、除非 HAL_SPI_Receive ()已经执行此操作... HAL_SPI_Receive (&hspi3、&datacon、1、50); convert |= dataacon; convert<=8; } // TODO:考虑将符号扩展字节附加到"converter"(基于 ADC 数据的最高有效位)、请参阅以下 URL 以了解示例: // e2e.ti.com/.../it-s-in-the-math-how-to-convert-adc-code-to-a-voltage-part-1 HAL_delay (1); HAL_GPIO_Write_pin、GPIO_set }
我希望这会有所帮助!
尊敬的大厅:
@克里斯托弗·霍尔的其余代码看起来不错吗? 我的意思是、我必须将转换数据类型更改为有符号数据类型、并在发送 RDATA 命令后引入短延迟。 发送1ms 延迟是否起作用? 我还将处理 fifo mISO 输出。 是否可以在初始代码和阶段复位芯片选择、并且直到结束才会置位 adc_init()的其他部分看起来正常? 请指出所有其他可能的错误、因为我不确定数据是写入状态寄存器、ADCON 寄存器还是 DRATE 寄存器。 当我尝试读回数据时、我会得到一个大的零点。 您可以看到我的读取寄存器代码。 请帮我解决此问题。
你好、Gokul、
假设您对 ADS1256使用标称7.68MHz 时钟、则"T6"延迟仅需约为6us。 数据表显示"T3"的最小值为0ns、但我建议使其至少为50ns。
如果您将这些延迟设置得太长、则需要更长时间才能输出 ADC 数据、这可能会在尝试以更快的数据速率运行 ADC 时出现问题。
/CS 用于选择要与 SPI 总线上的哪个器件通信、因此、如果 SPI 总线上只有一个器件、则从技术上讲、可以将其保持为低电平。 但是、我强烈建议不要以这种方式使用/CS。。。
/CS 可防止从器件在 SCLK 处于高电平时对其做出响应。 因此、为了防止 MCU 和 ADC 不同步(由于 SCLK 信号上的噪声或干扰)、只需将/CS 设置为低电平即可发出命令(或读取数据)、然后在完成后将其设置回高电平。 每次将/CS 设置为低电平时、ADC 的 SPI 外设都会复位以查找下一条命令的开始、这有助于使 SPI 通信在主器件和从器件之间保持一致。
我查看了您的代码的其他部分、并有以下评论
尊敬的 Hall:
克里斯托弗·霍尔(1528318)您好! 您的所有要点都非常有用、我在我的计划中实施了。 遗憾的是、我仍然没有收到转换数据。 我将与您共享两个代码、一个与 Arduino 共享、另一个与 stm32f302r8共享。 代码在 Arduino 中运行得非常完美、即显示串行监视器中两个通道(ain0和 ain1都是正通道)的两个转换数据。 但是、当我尝试对 stm32f302r8执行相同操作时、它不起作用。 我已在 SPI 模式1 (i.e) CPHA 2边缘和 COPL 低电平下初始化 SPI。 我已上传了两个 Arduino 中的 clk、miso 和 mosi 信号示波器图像、供您参考。 对于 stm32f302r、我在 MISO 引脚中看不到任何信号。 您能不能帮助我调试我的问题、因为我对控制器领域比较陌生。 请对 Arduino 和 stm32f302r8板中的波形进行评论、因为我对单调的信号非常怀疑。 感谢您先前的回复! 很抱歉、post.e2e.ti.com/.../waveform.rar 这么长的时间
Arduino 代码
/* ADS1256 CLK -引脚13 DIN -引脚11 (MOSI) DOUT -引脚12 (MISO) CS -引脚10 DRDY -引脚9 RESET-引脚8 (或设置为高电平?) DVDD - 3V3 DGND - GND */ #define cs 10 //芯片选择 #define Rdy 9 //数据就绪、输入 #define Rst 8 //复位引脚 #define pwd 7 //断电 #define flag 0 // #define SPISPEED 1000000 // 1250000 #define RDATA 0x01 #include //字节数据= 0b00000000; void mux (byte data) { spi.transfer (0x50 | 1);// MUX 寄存 器 spi.transfer (0x00);//第二个命令字节,只写入一个寄存器 spi.transfer (data);//将数据库写入寄存器 delayMicroseconds (10); } void sync () { // spi.transfer (0x110);// spi.transfer (SPI);delaySPI (0x1111); //wakeup 0000 spi.transfer (0x00); delayMicroseconds (10); } void calculation() { int32_t adc_val =0; float V = 0; adc_val = spi.transfer (0); adc_val <<= 8;//向左移动 adc_val |= spi.transfer (0);adc_val <5.5960v/v = 0.60val = 0.60v0;adc = 0.60v/+60val =+60val delayMicroseconds (10); Serial.println (adc_val、hex); Serial.print ("+"); Serial.println (V); } void setup() { Serial.begin(115200); int8_t data; PinMode (cs、Output); digitalWrite (cs、low);//绑定的低电平也是正常的。 pinMode (rdy、input); pinMode (rst、output); digitalWrite (rst、output) 低电平); 延迟(1);//板载时钟至少为4个时钟周期的低电平。 100微秒就足够 了 digitalWrite (rst、HIGH);//现在重置为 deafult 值 //delay (500); SPI.begin();//启动 SPI 总线 //delay (500); //init digitalWrite (pwd、low); //while (digitalRead (rdy)){}//等待 READY_LINE 变为低电平 SPI.beginTransaction(SPISettings(SPISPEED、MSBFIRST、SPI_MODE1);//启动 SPI delayMicroseconds (10); //重置为加电值(FEH) SPI.transfer (0xFE); 微秒(10);//重置为微秒; BYTE STATUS_REG = 0;//地址(数据表第30页) // PGA 设置 //1±5V /2±2.5V // 4±1.25V // 8±0.625V // 16±312.5mV // 32±156.25mV // 64±78.125mV // byte STATUS_DATA = 0x01;//状态:最高有效 位转换(0X00110)|禁用数据转换(SPI_transfer = 0x000100) //第二个命令字节,只写入一个寄存器 spi.transfer (STATUS_DATA);//将数据库写入寄存器 delayMicroseconds (10); Serial.println ("状态完成"); spi.transfer (0x01 | STATUS_reg); spi.transfer (0x00);//第二个命令字节,只写入一个寄存器 delayMicrodata (0x25) ;delaytln (10);spi.transfer (SPI);spi.transfer (0x16 (SPI)(20 (20); 字节 adcon_reg = 2;//A/D 控制寄存器(地址02h) 字节 adcon_data = 0x20;// 0 01 00 000 =>时钟输出频率= fCLKIN、传感器检测关闭、增益1 SPI.transfer (0x50 | adcon_reg); SPI.transfer (0x00);//第二条命令、仅写入一个寄存器 SPI.transfer、增益1 SPI.delyte (0x50 | adcon_reg);写入一个寄存器 (10秒) serial.println ("adcon done"); //设置采样率 字节 drate_reg = 3; 字节 drate_data = 0b11110000;// 100SPS SPI.transfer (0x50 | drate_reg); SPI.transfer (0x00); SPI.transfer (drate_data); delayMicroseconds (10); Serial.printn ("tlder") SPI.transfer (0xF0); delay (500); // digitalWrite (cs、HIGH); serial.println ("已配置、正在启动"); mux (0b00001111);//diff 1 sync (); delay (500); } void loop () { Serial.println (); //Serial.println ("adc"); // digitalWrite (cs、low); SPI.beginTransaction(SPISettings(SPISPEED、MSBFIRST、SPI_MODE1); //启动 SPI delayMicroseconds (10); while (digitalRead (rdy)=1){}; mux (0b00011111);//diff 1 sync.; sery.println ("pot"); spi.transfer (RDATA);//读取数据0000 0001 (01h) delayMicroseconds (10); 计算(); delayMicroseconds (10); // digitalWrite (cs、HIGH); //spi.endTransaction (); // ADS1255/6以二进制二 进制//补码格式输出24位数据。 LSB 的权重为 /2VREF/(PGA (223−1))。 正满量程输入会产生 输出代码7FFFFFh、负满量程 //输入会产生输出代码800000h。 if (adc_val > 0x7ffff){//if MSB = 1 ADC_val =(16777215ul - ADC_val)+ 1;//执行二进制补码 serial.print("-"); } 否则 { serial.print ("+"); } */ /mV /= 1000; delay (100); Serial.println (); while (digitalRead (rdy)= 1){}; mux (0b00001111); sync (); //sync 命令1111 1100 spi.transfer (0xFC); delayMicroseconds (10); //wakeup 0000 spi.transfer (0x00); delayMicroseconds (10); Serial.println ("LDR"); spi.transfer (RDATA);//读取数据0000 0001 (01h) delayMicroseconds (10); // digitalWrite (cs、HIGH); //spi.endTransaction (); calculation(); }
Stm32f302r8代码
#include "main.h" /* private 包括------------------------------------------------------- */ /*用户代码开始包括*/ /*用户代码结束包括*/ /*私有 typedef ------------------------------------------------------- */ /*用户代码 begin PTD */ /*用户代码 end PTD */ /* private define ------------------------------------------------------- */ /*用户代码 begin pd */ /*用户代码 end PD */ /*私有宏------------------------------------------------------- */ /*用户代码 begin PM */ /*用户代码 end PM */ /*私有变量------------------------------------------------------- / UART_HandleTypeDef hlpuart1; UART_HandleTypeDef hart3; SPI_HandleTypeDef hspi1; TIM_HandleTypeDef htim6; PCD_HandleTypeDef HPCD_USB_OTG_FS; /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* PRIVATE 函数原型------------------------------------------------------- */ void SystemClock_Config (void); static void MX_GPIO_Init (void); static void MX_LPUART1_UART_Init (void); static void MX_USART3_UART_Init (void); static void MX_TIM6_Init (void); 静态空 MX_USB_OTG_FS_PCD_Init (void); 静态空 MX_SPI1_Init (void); //用户代码 begin PFP */ void delay ()//创建26us 的延迟 { __HAL_TIM_ENABLE (&hmtim6); while (__HAL_TIM_GET_flag (&h6、_TIM_TIM_6= hTIM_TIM_TOP_DIT_RETPLATE );_ HTIM_6_TIM_DIT_HTIM_TOP_DIT_TIM_TOP_DIT_DIT_DISAL_6;_ TIM_TOP_DIT_DIT_DIT_DIT_DIT_ TIM_FLAG_UPDATE); } void adc_write (uint8_t address、uint8_t value) { uint8_t data[3]; data[0]= 0x50|地址; data[1]= 0x00; data[2]=值; delay (); HAL_SPI_transmit (&hspi1、data、3、10); delay (); } void adc_write_command (uint8_t 命令) { delay (); HAL_spi_transmit (&hspi1、命令、10); delay (); } void int adc_read (uint8_t datacc); pin (0xpin、convert);pin (1、pin (1、pin);pio+ 、pin (1、pin、eagio+) RESET_Pin、GPIO_PIN_SET); } void ADC_init () { delay (); adc_write_command (0xFE); delay (); ADC_WRITE_COMMAND (0x0F); delay (); ADC_WRITE (0x00、0x02); //status delay (); ADC_WRITE (0x02、0x20);//adcon Delay (); ADC_WRITE (0x03、 0x82);//drate 100sps delay (); adc_write_command (0xF0);//自 CAB of ADC delay (); HAL_delay (100);//100ms delay } //用户代码 end pFP *// /*私人用户代码------ */ /*用户代码开始0 */ /*用户代码结束0 */ /** @短于应用程序入口点。 *@retval int */ int main (void) { //*用户代码 begin 1 */ int32_t adc_data_ch0、adc_data_ch1; //用户代码 end 1 * /* MCU 配置------------------------------------------------------- // //*复位所有外设,初始化闪存接口和 SysTick。 // HAL_Init(); //用户代码 begin Init */ //*用户代码 end Init */ //*配置系统时钟*/ SystemClock_Init(); //*用户代码 begin sysinit */ //*用户代码 end sysinit *// //////*初始化所有已配置的外设*/ MX_GPIO_Init ();MX_LARTUSB_INIT_UART3_UARTUSB_INIT ();UART_UARTUSB_INTO_INIT mx_SPI1_Init(); //用户代码开始2 */ HAL_GPIO_WritePin (GPIOB、CHIP_SELECT_Pin、GPIO_PIN_RESET); ADC_RESET (); MX_SPI1_Init(); HAL_GPIO_WritePin (GPIOB、PDWN_Pin、GPIO_PIN_RESET); ADC_INIT (); /*用户代码末尾2 */ /* Infinite loop */ /*用户代码在*/ while (1) { HAL_GPIO_WritePin (GPIOB、CHIP_SELECT_Pin、GPIO_RESET_RESET)、0x01 (ADC_WRITE)时开始);(0x01); 0x0F);//通道0正 延迟()的多路复用器; adc_write_command (0xFC);//同步 延迟(); adc_write_command (0x00);//唤醒 延迟(); while (HAL_GPIO_ReadPin (DRDY_GPIO_Port、DRDY_Pin)); ADC_DATA_CH1 = ADC_READ (); HAL_GPIO_WritePin (GPIOB、CHIP_SELECT_Pin、GPIO_PIN_SET); HAL_DELAY (100); HAL_GPIO_WritePin (GPIOB、CHIP_SELECT_Pin、GPIO_PIN_RESET); DELAY (); ADC_WRITE (0x01、0x1F);//通道0正 延迟()的多路复用器; ADC_WRITE_COMMAND (0xFC);//同步 延迟(); ADC_WRITE_COMMAND (0x00);//唤醒 延迟(); while (HAL_GPIO_ReadPin (DRDY_GPIO_Port、DRDY_Pin)); ADC_DATA_ch0 = ADC_READ (); HAL_GPIO_WritePin (GPIOB、CHIP_SELECT_Pin、GPIO_PIN_SET); HAL_DELAY (100); HAL_GPIO_WritePin (GPIOB、LD2_Pin、1); delay (); HAL_GPIO_WritePin (GPIOB、LD2_Pin、0); delay(); /*用户代码结束,同时*/ //*用户代码开始3 */ } //*用户代码结束3 */ @*@系统时钟配置* retval 无 */ void SystemClock_Config (void) { RCC_OscInitTypeDef RCC_OscInitStruct={0}; RCC_ClkInitTypeDef RCC_ClkInitTypeS0 }={PeriphInClitType0};RCC_PeriphInPeriphInt ={0};RCC_PeriphInPeriphInt ={RiphInt} /**配置主内部稳压器输出电压 */ if (HAL_PWREx_ControlVoltageScaling (PWR_Regulator _VOLTAGE_SCALE1)!= HAL_OK) { ERROR_Handler (); } /**初始化 CPU、AHB 和 APB 总线时钟 */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitSator.HSEState = RCC_HSE_BYPASS; RCC_OscilitSource.PLLCC_RIC_PLL.PLLP.PLLPM_RIC_RIC_RSTATE = RIC_RIC_RIC_RSTATE;RIC_RIC_RIC_RICL = RIC_PLT.PLT.PLLPM_RIC_RIC_RSTATE;RIC_RIC_RIC_RIC_RIC_RITT. RCC_OscInitStruct.PLL.PLLN = 8; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;RCC_OscInitStruct.PLLL.PLL= RCC_RIC_InStruct.PLLQ= RCC_RIV2 ;RCC_RCC_RIC_InitStruct.PLLL.CL_RIC_RIC_RIC_RIC_RIVT=RIC_RIC_RIC_RIC_IFT.PLLL.CL_RIC_ON = RIC_RIC_RIC ERROR_Handler (); }/** 初始化 CPU、AHB 和 APB 总线时钟 */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKd = RCC_SYSCLCD_CLKDIV1 ;RCC_CLKCLKCLKCLKDIV1 = RCC_CLKCLK1;RCC_CLKCLKCLKCLKCLKCLKCLKDIVDD_CLK_CLKCLK_CLKCLK_CLKCLKCLK_CLK_CLKCLK_CLK_CLK_CLKDIVDD.CLK_CLK_CLK_CLKCLK if (HAL_RCC_ClockConfig (&RCC_ClkInitStruct, flash_latit_1)!= HAL_OK) { ERROR_Handler (); } PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART3|RCC_PERIPHCLK_LPUART1 |RCC_PERIPHCLK_USB; PeriphClkInit.USart3ClockSelection = RCC_USART3CLKSOURCE_PCLK1; PeriphClkInit.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1; PeriphClkInit = RiphLCC_LPART1CLKEST.R1CLIPRUSPIR1CL1;PLUCK_PLUCEST_PON1 = RIPLIPLIPRIPLIPRUSTRIPLESC1CLPON1;PLUCK_PON1 PLUCESCHIPRIPRIPRIPLCP_PON PeriphClkInit.PLLSAI1.PLLSAI1M = 1; PeriphClkInit.PLLSAI1.PLLSAI1N = 12; PeriphClkInit.PLLSAI1.PLLSAI1P = RCC_PLLP_DIV2; PeriphClkInit.PLLSAI1LP_PLLSAI2=PLLSAI1LP_PLLCLR2_RiphLCLR ;PeriphLCLLCLLCL_RSAI1RCL_R1RSAI1Q = PLLCL_RSAI2_PLLIP1;PLLCL_RSAI2_RIP1 PeriphClkInit.PLLSAI1.PLLSAI1ClockOut = RCC_PLLSAI1_48M2CLK; IF (HAL_RCCEx_PeriphCLKConfig (&PeriphClkInit)!= HAL_OK) { ERROR_Handler(); } } // *@LPUART1初始化函数* @param None *@retval None */ static void MX_LPUART1_UART_Init (void) { //用户代码 begin LPUART1_Init 0 *// ////*用户代码 end LPUART1_Init 0 *//* LPUART1_Init 1 */ LPART1_Init 1 *用户代码 end * hlpuart1.Init.baudate = 209700; hlpuart1.Init.WordLength = UART_WORDLENGTH_7B; hlpuart1.Init.stopbits = UART_stopbits_1; hlpuart1.Init.Parity = UART_parity; hlpuart1.Init.Mode = UART_MODE_TX_RX; hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_none; hlpuart1.Init.OneFeatureSampling = UART_one_bit_SAMPLE_DISABLE; hlpuart1.Init.ClockPrescaler = UART_Advature1_Inature1; UART_Inpet.Inuature1_Inuature.Inuature1 ;uart_Infor_Inuature1;uart_Inuature_Inuature.Inuature hlpuart1.FifoMode = UART_FIFOMODE_DISABLE; if (HAL_UART_Init (&hlpuart1)!= HAL_OK) { ERROR_Handler (); } if (HAL_UARTEx_SetTxFifoThreshold (&hlpuart1、UART_TXFIFO_THREST_1_8)!= HAL_OK) { ERROR_Handler (); } if (HAL_UARTEx_SetRxFifoThreshold (&hlpuart1、UART_RXFIFO_THRESHOLD_1_8)!= HAL_OK) { ERROR_Handler(); } //*用户代码 begin LPUART1_Init 2 *// //*用户代码 end LPUART1_Init 2 */ } //* @简要 USART3初始化函数 *@param 无 *@retval 无 */ static void MX_USART3_UART_Init (void) { //*用户代码 begin USART3_Init 0 *// */ USER CODE END/* USER CODE END/ USER CODE BEGIN 0 USART3_Init 1 */ ///*用户代码结束 USART3_Init 1 */ huart3.instance = USART3; huart3.Init.baudate = 115200; huart3.Init.WordLength = UART_WORDLENGTH_8B; huart3.Init.stopbits = UART_stopartbits 1; uart.inuart3 = UART_parity = UART3_uniity 奇偶校验;uart.inuart.inuit_3 huart3.Init.Mode = UART_MODE_TX_RX; huart3.Init.HwFlowCtl = UART_HWCONTROL_none; huart3.Init.overSAMPLING = UART_OPAMPLING_16; huart3.Init.OneBitSample_disable;huart3.Init_DIV1 ;uartPrescaler = UART_DIV1 huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_init; if (HAL_UART_Init (&huart3)!= HAL_OK) { ERROR_Handler (); } if (HAL_UARTEx_SetTxFifoThreshold (&huart3、UART_TXFIFO_THREST_1_8)!= HAL_OK) { ERROR_Handler (); } if (HAL_UARTEx_SetRxFifoThreshold (&huart3、UART_RXFIFO_THRESHOLD_1_8)!= HAL_OK) { ERROR_Handler(); } if (HAL_UARTEx_DisableFifoMode (&huart3)!= HAL_OK) { ERROR_Handler(); } //*用户代码 begin USART3_Init 2 *// //*用户代码 end USART3_Init 2 */ } //* @SPI1初始化函数* @param 无 *@retval 无 */ static void MX_SPI1_Init (void) { //*用户代码 begin SPI1_Init 0 */ //*/* USER CODE END SPI1 USER CODE 0 */ USER CODE END USER CODE 0 SPI1_Init 1 */ //*用户代码结束 SPI1_Init 1 */ /* SPI1参数配置*/ hspi1.instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; hspi1.Init.DIRECTION = SPI_DIRECT_2LINES;hspi1.Init.Spi1_SPI_POLIT.MODE = SPI_POLIT_1; HSPI8SPI_BIT_RATI.DIT_SPI_BIT.DIT.DIT.DIT.DIT.DIT.DIT.DIT_DIT_LIT_DIT_DIT_ hspi1.Init.CLKPhase = SPI_PHASE_2EDGE; hspi1.Init.NSS = SPI_NSS_Soft; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32; hspi1.Init.FirstBit = SPI_FIRSTBIT_BADDRESCAST_32;HTIESCAST_DITESCAST_DISABET_DISABLE_32;hTIMESCAST_INIT_INIT_DITIDT_TIMESCL.TDITDI hspi1.Init.CRCalaculy = SPI_CRCCALCULATION_DISABLE; hspi1.Init.CRCPolynomial = 7; hspi1.Init.CRCCLhelength = SPI_CRC_LENGTH_DATAZE; hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; if (H_OK) (HAL_1)!(HAL_OK ERROR_Handler(); } /*用户代码 begin SPI1_Init 2 */ //*用户代码 end SPI1_Init 2 */ } //* @简短 TIM6初始化函数 *@param 无 *@retval 无 */ static void MX_TIM6_Init (void) { //*用户代码 begin TIM6_Init 0 */ //*/*用户代码 retval 0_DIM6_Init 0* ={mastrType0} /*用户代码 begin TIM6_Init 1 */ //*用户代码 end TIM6_Init 1 */ htim6.instance = TIM6; htim6.Init.Prescaler = 0; htim6.Init.CounterMode = TIM_COUNTERMODE_UP; htim6.Init.PERIOD = 31; autocontim6_Inload.Inload.Inautobrad.autobiad.TIM6_autobr.autobiad.autobiad.autobiad.autobiad.autobiad.autob if (HAL_TIM_Base_Init (&htim6)!= HAL_OK) { ERROR_Handler (); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; IF (HAL_Timex_MasterConfigSynchronization (&htim6、&sMasterConfig)!= HAL_OK) { ERROR_Handler(); } //*用户代码 begin TIM6_Init 2 *// ////*用户代码 end TIM6_Init 2 */ }//* @简要 USB_OTG_FS 初始化函数 *@param 无 *@retval 无 */ static void MX_USB_OTG_FS_Init (void) {// *用户代码 begin USB_OTG_FS_Init 0* /US_Init 0* / US_Incode *用户代码* USB_OTG_FS_Init 1 */ *用户代码结束 USB_OTG_FS_Init 1 */ hpcd_USB_OTG_FS.instance = USB_OTG_FS; hpcd_USB_OTG_FS.Init.dev_endpoints = 6; hpPCD_USB_OTG_FS.Init.phy_itface = hpcd_PHY_embedded; hpcd_USB_OTG_FS.Init.Init = hpcd_enable_enable_usb_enable.usb_enable.enable_usb_enable.enable= hpcd_power_f_enable.us_enable.us_enable HAL_USB_OTG_FS.Init.lpm_enable = disable; hpcd_USB_OTG_FS.Init.battery_charging_enable = enable; hpcd_USB_OTG_FS.Init.use_dedicated_ep1 = disable; hpcd_USB_OTG_FS.Init.VBUS_sensing_enable = enable; if (HAL_PCD_Init (&hpd_USB_OTG_FS))= OK! ={hpdc HAL_OK_OK ERROR_Handler ();}//用户代码 begin USB_OTG_FS_Init 2 *///*用户代码 end USB_OTG_FS_Init 2 */}//*@简要 GPIO 初始化函数*@param 无*@retval 无*/ static void MX_GPIO_Init 2 *}{GPIO_InitTypeDef GPIO_Int GPIO_ENABLE_CLK;_ GPIO_REST_CLK_ENABLE_GPIO_RIC_CLK_ENABLE_CLK (*=_ GPIO_RCO_CLK_ENABLE_CLK_ENABLE_CLK_ENABLE_CLK_ENABLE_CLK_ENABLE_GPIOR_CLK_ENABLE_CLK_ENABLE_CLK_=_(_);_ GPIOR_CLK_GPIO_RCO_CLK_ENABLE_CLK_ENABLE_CLK_ENABLE_CLK_ENABLE_CLK_ENABLE_CLK_ENABLE _HAL_RCC_GPIOD_CLK_ENABLE (); __HAL_RCC_GPIOG_CLK_ENABLE (); HAL_PWREx_EnableVddIO2 (); /*Configure GPIO 引脚输出电平* HAL_GPIO_WritePin (GPIO_Select_Pin);*GPIO_Pin Pin Pin、GPIO_Pin、GPIO_RPM_Pin、GPIO_Pin = GPIO_Pin、GPIO_Pin、GPIO_Pin、GPIOb = 1、GPIO_Pin、GPIO_Pin、GPIO_Pin、GPIO_Pin、GPIOb = 1、GPIO_Pin、GPIO_Pin、GPIO_Pin、GPIO_Pin、GPIO... /*配置 GPIO 引脚:DRDY_Pin */ GPIO_InitStruct.Pin = DRDY_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT.Pull ;GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init (DRDY_GPIO_Port、&GPIO_InitStruct)); /*配置 GPIO 引脚:CHIP_SELECT_Pin RESET_Pin PDWN_Pin */ GPIO_InitStruct.Pin = CHIP_SELECT_PULT|PDWN_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTP_PP; GPIO_InitStruct.Pull = GPIO_PULL_PULLUP;GPIO_InIT_InSpeed = GPIO_LET.B_LOW;GPIO_LET_GPIO_LET_GPIO_LET.Q_GPIO_LET.GPIO_LET.GPIO_LET.GPIO_LET.GPIO_LET.GPIO_LET. GPIO_InitStruct); /*配置 GPIO 引脚:LD3_Pin LD2_Pin */ GPIO_InitStruct.Pin = LD3_PIN|LD2_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTP_PP; GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InITStruct.Pin = GPIO_InSpeed ;GPIO_InQ_InfrT.B;GPIO_InIT_Inspeed = GPIO_LET.GPIO_LET.Q_InIT_InIT_LOT &GPIO_InitStruct); /*配置 GPIO 引脚:USB_PowerSwitchOn_Pin */ GPIO_InitStruct.Pin = USB_PowerSwitchOn_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTP_PP; GPIO_InitStruct.Pull = GPIO_InitSwitchOn_PLL;GPIO_InitSfor_Speed = GPIO_InT_Port_InSpeed;GPIO_T.Q_InT_PowerPort_InSpeed &GPIO_InitStruct); /*配置 GPIO 引脚:USB_Over流 引脚*/ GPIO_InitStruct.Pin = USB_Over流 引脚; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init (USB_OPA_Struct.Port );&GPIO_InStructure_InPort} /* USER CODE BEGIN 4 */ /* USER CODE END 4 */ /** @brief 在发生错误时执行此函数。 *@retval None */ void Error_Handler (void) { //*用户代码 begin Error_Handler_debug */ //*用户可以添加自己的实现来报告 HAL 错误返回状态*/ //*用户代码 end Error_Handler_debug */ } #ifdef use_full_assert // *@brief 报告源文件和源文件的名称 行号 * 发生了 assert_param 错误的位置。 *@param 文件:指向源文件名的指针 *@param 行:assert_param 错误行源编号 *@retval 无 */ void assert_failed (char *文件、uint32_t 行) { //*用户代码 begin 6 *// //*用户可以添加自己的实现来报告文件名和行号, TEX:printf ("错误的参数值:第%d\r\n"行上的文件%s、文件、行)*/ //*用户代码结束6 */ } #endif //* use_full_assert *
你好、Gokul、
我建议首先探测 ADS1256上的/DRDY 信号、以确保其处于活动状态。 您应该会看到一个周期性波形、其中/DRDY 下降沿之间的时间对应于数据速率。 如果没有、则需要检查 ADC 是否正确通电、GPIO 配置是否正确以及器件是否计时。
如何将 ADS1256连接到 STM MCU? 这些器件之间是否有公共接地?
在其中一个波形(使用 Arduino)上、DOUT 看起来没有稳定的接地基准电压。
注意:在探测 SPI 信号时、请确保在 ADC 附近探测它们、并将示波器接地至 ADC 的接地电位、以便您可以看到 ADC 看到的结果。
尊敬的 Hall:
我检查了您提到的所有内容、但仍然无法将转换后的数据从 ADC 获取到 stm32f302r8板。 请仔细检查这两个代码、并尝试指出我的 stm32f302r8代码中的错误。 我在前面的注释中共享了代码。 我想我的代码中缺少一些东西。 请帮助我找到代码中缺少的器件。 供参考、我在前面的注释中共享的 Arduino 代码运行良好。 我的 SPI 时钟极性较低且时钟相位2相位边缘的1MHz 时钟。 请帮我处理同样的问题。
你好、Gokul、
您是否可以捕获更多的 SPI 通信示波器截屏? (理想情况下显示/CS、DIN、DOUT、SCLK 信号)。
我查看过您的代码一次、没有看到任何明显的错误。 如果您仍然遇到问题、那么我认为查看 SPI 信号将是进行故障诊断的最简单方法。
尊敬的 Hall:
我的 DOUT 引脚中没有任何波形。 我真的不知道问题是什么。 我已经向大家介绍了 Din 和 SCLK 波形、并且我启用了 GPIO 引脚、用于随时将芯片选择设为低电平。 我还在 DRDY 引脚中获取周期性信号。 是否有可能不会将数据写入状态 adcon 和 drate 寄存器中。 如果 SPI 不工作、那么我永远不会得到 Din 波形、但在我的例子中、我得到了该波形。 我认为转换不是在 ADC 端进行的、而且 ADC 端还有任何8位数据传输寄存器。 如果不是从何处获取转换后的数据。 如果我错了、请纠正我的问题。 再次感谢您快速回复。
你好、Gokul、
ADS1256如何连接到 STM MCU? 您是跳过 ADS1256EVM 的接线、还是构建了自己的 PCB?
如果您看到一个周期/DRDY 信号、但在感应 SCLK 时没有 DOUT、则 MCU 和 ADC 之间的接地基准悬空、或者/CS 可能保持高电平。
尊敬的 Hall:
Christopher Hall 、我使用的是 Waveeshare 高分辨率 ADC 和 Nucleo- F302R8 MCU 板。 我使用跳线连接两个板。 今天我检查了我的代码,发现 DRDY 引脚始终处于高电平,并停留在以下语句中:while (HAL_GPIO_ReadPin (DRDY_GPIO_Port、DRDY_Pin))。 我还验证了它们是否已连接到公共接地。 问题可能出在哪呢?
尊敬的 Hall:
正如 我之前所说的、我正在尝试将波浪形 ADC 与 Nucleo -f302r8板连接。 现在、我能够转换数据并在我的微控制器中接收数据、但我面临着一 组不同的问题。 接收到的数据不在刻度限制范围内。 我已经给出了2.5V 的基准电压和下面的寄存器值。
状态寄存器= 0x02
ADCON = 0x20
速率 = 0x82
输入多路复用器= 0x0F aincom = grnd //正态通道
当我在 ain0中给出0v 时、我将获得800000作为输出、对于5V、我将获得 BFFFFF
0V - 800000 5V - BFFFFF
输入多路复用器= 0xF0 aincom = grnd //负通道
当我在 ain0中给出0v 时、我将获得 FFFFFF 作为输出、对于5V、我将获得 C00000
0V - 800000 5V - C00000
此外、我的数据会有些波动、并给出任何保持稳定的建议。
你好、Gokul、
您使用什么来输入信号源、它相对于 ADS1256是如何连接和偏置的? 如果您有可以分享的电路原理图、那将非常有用。
似乎您的输入信号源连接到不同于 ADS1256的接地基准。 您可能还需要探测基准电压以确保其稳定。 如果基准电压发生振荡、则可能会得到意外且振荡的 ADC 输出代码。
此致、
Chris
尊敬的 Hall:
Christopher Hall 非常感谢您的帮助。 从最初阶段看来,问题似乎就在于接地。 现在正在进行转换、我能够读取一个更精确的值、最多可达5个小数点。 尽管正在进行转换、但我发现每秒样本数存在一些不匹配。 因此、我在写入一些值后读取所有三个寄存器(状态、adcon 和 DRATE)、留下500ms 的足够延迟时间。 结果是值不匹配。 请查看以下数据。 您能帮助我解决这个问题吗? 但是、即使存在这种不匹配、我也会获得正确的转换数据。 原理图链接(https://www.waveshare.com/w/upload/2/29/High-Precision-AD-DA-board.pdf)供您参考)。
寄存器 | 写入值(十六进制) | 500ms 后读取值(十六进制) |
状态 | 0x06 | 0x30 |
Adcon | 0x20 | 0x20 |
速率 | 0x82 | 0xF0 |
尊敬的 Hall:
正如 我之前提到的、我的 ADC 工作正常、但我在寄存器中写入时遇到了问题、但我仍然能够获取转换后的数据。 请查看我之前的评论。 我有两个问题要解决。 请帮我处理同样的问题。
问题1:我在 STATUS、ADCON、DRATE 寄存器中写入的值与我在同一寄存器中100ms 后读取的值不匹配。
但是、我在 MUX 寄存器中写入的值是匹配的、并且我通过动态变化对其进行了验证。 请帮我解决问题。
问题2:DRate 值默认为0xF0 (因为 DRate 值在我写它时不更新)、即30ksps、我已使用示波器中的 drdy 信号验证了该值。
问题是、当我以频率为1Hz 的正弦信号(时间周期= 1sec)的形式给出输入时、我在一秒内仅获得2.8k 样本
我的假设是、如果我设置为30ksps、那么对于时间周期为1sec 的正弦波、应该得到30k 样本、但当我读取样本时、我只得到2.8k 样本。 我已经设置了 SPI 时钟频率 2MHz。 如果我错了、请纠正我的问题。
我应该怎么做才能获得至少10k 个样本?
你好、Gokul、
由于此问题与您的其他帖子有点重复、请在此处查看我的回答:
https://e2e.ti.com/support/data-converters/f/73/p/859187/3177623#3177623
此致、
Bob B