• 365查看
  • 0回复

[底层软件] 单片机项目中使用新IC芯片调试方法

[复制链接]


该用户从未签到

发表于 2-3-2024 15:25:00 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


单片机项目中使用新IC芯片调试方法w1.jpg

前一阵子,一位小伙伴咨询我一款新IC芯片怎么使用,借此机会我顺便把我日常工作中经常用到的一种调试方法介绍给小伙伴们,希望对对大家有所帮助。准备仓促,文中难免有技术性错误,欢迎大家给予指正,并给出好的建议...??

单片机项目中使用新IC芯片调试方法w2.jpg

前言:

我们在单片机的项目开发过程中经常会遇到使用新IC芯片的情况,某宝卖家有个时候也提供不了对应开发程序,到网上找资料也找不到;很多初学者面对这样的问题往往束手无策,这里我给大家介绍我经常用的其中一种新IC调试的方法。

因为这个芯片比较简单我这里采用下面步骤进行:

第一步:先用arduino+面包板快速搭建电路验证芯片功能

第二步:使用STM32CubeIDE快速搭建工程验证在STM32上工作是否正常

Tips:由于我手头没有万用表,这里我使用arduino的模拟电压采集功能通过串口打印出来作为电位计的电压监控用。

单片机项目中使用新IC芯片调试方法w3.jpg

首先,我们先快速浏览芯片数据手册,获取重要信息

IC型号:TLP0501

电压范围:2.7~5.5V

温度范围:-40~125℃

通信方式:SPI

阻值:100KΩ

阻值偏差:±20%

该芯片是德州仪器的一款单通道数字电位计,通信方式是SPI总线,单方向的,即只能控制芯片,不能读取输入数据,下面是数据手册的具体介绍。

环境参数:主要包括温度使用范围、电压使用范围、误差、温度漂移以及实物引脚对应关系都在这里

单片机项目中使用新IC芯片调试方法w4.jpg

环境参数

功能框图:主要介绍该芯片的内部组成和工作原理

单片机项目中使用新IC芯片调试方法w5.jpg

功能框图

引脚定义:每个引脚的功能介绍

单片机项目中使用新IC芯片调试方法w6.jpg

引脚定义

SPI通信说明:主要介绍芯片的通信方式,这个芯片因为没有设置模式功能,只需要对芯片直接写数据即可,通信方式与我们所使用的74HC595的方式类似

单片机项目中使用新IC芯片调试方法w7.jpg

SPI通信说明

真值对照表:也就是数字量对应的实际电阻值,我这里只截取了一部分,剩下的大家可以自行去参考详细手册

单片机项目中使用新IC芯片调试方法w8.jpg

真值对照表

对于要调通这个芯片这些介绍基本满足我们的需求了

单片机项目中使用新IC芯片调试方法w9.jpg

芯片模块的快速制作

在芯片商城上买了两片回来调试,芯片购买的费用知乎小伙伴给付了

单片机项目中使用新IC芯片调试方法w10.jpg

准备好芯片+转接板

单片机项目中使用新IC芯片调试方法w11.jpg

焊接两块是为了防止在使用过程中意外弄坏另一块可以立马补上,确保调试正常进行而不耽误太多时间

单片机项目中使用新IC芯片调试方法w12.jpg

焊接好排针,并在供电端加上0.1uF的滤波电容,降低高频供电干扰

单片机项目中使用新IC芯片调试方法w13.jpg

这样我们的模块就制作完成了



arduino快速搭建工程:

电路原理图

单片机项目中使用新IC芯片调试方法w15.jpg

电路原理图

引脚对应关系:

arduino uno 引脚4       ->   CLK

arduino uno 引脚5       ->   DIN

arduino uno 引脚6       ->   CS

arduino uno 引脚5v     ->   VCC、VREF

arduino uno 引脚GND  ->  GND、L

arduino uno 引脚A0    ->  VRES_OUT

首先用面包板+杜邦线搭好电路

说明:我在这里使用的供电电压和数字电位计参考电压都是使用的5V,相应的输出结果也是在0~5V范围

单片机项目中使用新IC芯片调试方法w16.jpg

然后使用arduino自带的库,编写代码,再变动阻值参数,看下输出的实际结果和真值表是否对应的上

数值为0x00时对应的模拟电压输出

单片机项目中使用新IC芯片调试方法w17.jpg

数值为0x88时对应的模拟电压输出

单片机项目中使用新IC芯片调试方法w18.jpg

数值为0xFF时对应的模拟电压输出

单片机项目中使用新IC芯片调试方法w19.jpg

经过验证,在arduino上跑没有问题,接下来我们准备在STM32上去运行

arduino代码部分:
/*  AnalogReadSerial
  Reads an analog input on pin 0, prints the result to the Serial Monitor.  Graphical representation is available using Serial Plotter (Tools > Serial Plotter menu).  Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground.
  This example code is in the public domain.
  http://www.arduino.cc/en/Tutorial/AnalogReadSerial*/
int CS_Pin = 6;intCLK_Pin = 4;int DIN_Pin = 5; //这里定义了那三个脚
// the setup routine runs once when you press reset:void setup() {  pinMode(CS_Pin,OUTPUT);  pinMode(CLK_Pin,OUTPUT);  pinMode(DIN_Pin,OUTPUT); //让三个脚都是输出状态// initialize serial communication at 9600 bits per second:  Serial.begin(9600);
  digitalWrite(CS_Pin,LOW);   shiftOut(DIN_Pin,CLK_Pin,MSBFIRST,0xFF);  digitalWrite(CS_Pin,HIGH);}
// the loop routine runs over and over again forever:void loop() {// read the input on analog pin 0:int sensorValue = analogRead(A0);float voltage= sensorValue * (5.0 / 1023.0);   //换算成电压// print out the value you read:  Serial.println(voltage,DEC);  delay(100);        // delay in between reads for stability}


STM32搭建工程验证

说明:STM32使用的供电电压和数字电位计参考电压都是3V3,相应的输出结果也是在0~3V3范围



电路原理图

引脚对应关系:

PA4       ->   CLK

PA5       ->   DIN

PA6       ->   CS

3V3       ->   VCC、VREF

arduino uno 引脚GND  ->  GND、L

arduino uno 引脚A0     ->  VRES-OUT

开发板+面包板搭建电路



用STM32CubeIDE建立一个工程

单片机项目中使用新IC芯片调试方法w23.jpg

配置好PA4、PA5、PA6引脚为输出

单片机项目中使用新IC芯片调试方法w24.jpg

生成代码,并添加TLP0501的驱动代码

单片机项目中使用新IC芯片调试方法w25.jpg

编译看运行的效果,输入值为0x55

单片机项目中使用新IC芯片调试方法w26.jpg

更改输入的数值为0x22,验证是否正确

单片机项目中使用新IC芯片调试方法w27.jpg

main函数代码部分:
/* USER CODE BEGIN Header *//**  ******************************************************************************  * @file           : main.c  * @brief          : Main program body  ******************************************************************************  * @attention  *  * <h2><center>? Copyright (c) 2021 STMicroelectronics.  * All rights reserved.</center></h2>  *  * This software component is licensed by ST under BSD 3-Clause license,  * the "License"; You may not use this file except in compliance with the  * License. You may obtain a copy of the License at:  *                        opensource.org/licenses/BSD-3-Clause  *  ******************************************************************************  *//* USER CODE END Header *//* Includes ------------------------------------------------------------------*/#include"main.h"
/* Private includes ----------------------------------------------------------*//* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*//* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*//* USER CODE BEGIN PD */
#define TLP0501_DIN_H()    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET)#define TLP0501_DIN_L()    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET)
#define TLP0501_CS_H()     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET)#define TLP0501_CS_L()     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET)
#define TLP0501_CLK_H()    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET)#define TLP0501_CLK_L()    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET)

/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*//* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/voidSystemClock_Config(void);staticvoidMX_GPIO_Init(void);/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*//* USER CODE BEGIN 0 */voidTLP0501_WriteByte( uint8_t data ){uint8_t j;for ( j=8; j>=1; j--)    {        TLP0501_CLK_L();        __NOP();if(data & 0x80 ){   TLP0501_DIN_H();    }else            {   TLP0501_DIN_L();    }        data <<= 1;        TLP0501_CLK_H();    }}

/* USER CODE END 0 */
/**  * @brief  The application entry point.  * @retval int  */intmain(void){/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */  HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */  SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */  MX_GPIO_Init();/* USER CODE BEGIN 2 */
  TLP0501_CS_L();  TLP0501_WriteByte(0x22);  TLP0501_CS_H();

/* USER CODE END 2 */
/* Infinite loop *//* USER CODE BEGIN WHILE */while (1)  {/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */  }

/* USER CODE END 3 */}
/**  * @brief System Clock Configuration  * @retval None  */voidSystemClock_Config(void){  RCC_OscInitTypeDef RCC_OscInitStruct = {0};  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Initializes the RCC Oscillators according to the specified parameters  * in the RCC_OscInitTypeDef structure.  */  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;  RCC_OscInitStruct.HSIState = RCC_HSI_ON;  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)  {    Error_Handler();  }/** Initializes the CPU, AHB and APB buses clocks  */  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)  {    Error_Handler();  }}
/**  * @brief GPIO Initialization Function  * @param None  * @retval None  */staticvoidMX_GPIO_Init(void){  GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */  __HAL_RCC_GPIOD_CLK_ENABLE();  __HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin Output Level */  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6, GPIO_PIN_RESET);
/*Configure GPIO pins : PA4 PA5 PA6 */  GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6;  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;  GPIO_InitStruct.Pull = GPIO_NOPULL;  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
/* USER CODE BEGIN 4 */
/* USER CODE END 4 */
/**  * @brief  This function is executed in case of error occurrence.  * @retval None  */voidError_Handler(void){/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */
/* USER CODE END Error_Handler_Debug */}
#ifdef  USE_FULL_ASSERT/**  * @brief  Reports the name of the source file and the source line number  *         where the assert_param error has occurred.  * @param  file: pointer to the source file name  * @param  line: assert_param error line source number  * @retval None  */voidassert_failed(uint8_t *file, uint32_t line){/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */}#endif/* USE_FULL_ASSERT */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/


总结:

1、这里介绍了众多新IC芯片调试方式中的一种,后期有机会再陆续介绍其他IC或新模块的调试方法。

2、文中只是简单的对芯片进行功能测试,实际项目中还会有移植、驱动的可靠性、稳定性等测试工作 。

3、我们要善于运用手头的工具、arduino等快速验证开发环境;模块的快速验证,特别是在项目开发过程中,时间就是金钱,对每一种工具的熟练掌握也是单片机开发过程中不可或缺的重要技能。

4、硬件调试与软件调试有很大的区别,很多时候是一次性,不可逆转的,不像软件Ctl+Z可以撤销;硬件在使用过程中出现意外损坏情况很正常:焊接不当、意外插错,静电防护不到位等等;我们要善于运用一些项目技巧,权衡时间或花费;这里之所以选择焊接两个芯片模块也是为了防止这种意外的发生而对调试造成不必要的时间耽搁。


该用户从未签到

发表于 14-3-2025 20:18:00 | 显示全部楼层
单片机项目中采用新IC芯片的调试方法确实需要细致和专业。针对您所提到的情况,我为您提供以下专业的调试步骤和建议:

首先,确保新IC芯片的物理连接正确无误。建议使用高质量的工具进行焊接或使用可靠的连接方式如插针和面包板。接下来,按照芯片的数据手册进行初始配置和参数设置。务必关注电压、电流等关键参数,确保它们符合芯片的要求。使用Arduino作为初步测试平台是不错的选择,可以快速搭建并验证基本功能。在此基础上,逐步进行功能测试,如输入输出、通信接口等。遇到问题时,结合逻辑分析仪或示波器等工具进行信号分析。针对出现的问题,结合数据手册进行故障排查和调试。在此过程中,充分利用已有的开发资源和经验,并不断尝试新的解决方案。最后,优化性能和稳定性,确保新IC芯片在单片机项目中发挥最佳性能。欢迎指正和提出建议,共同进步。
回复 支持 反对

使用道具 举报



该用户从未签到

发表于 14-3-2025 20:18:00 | 显示全部楼层
单片机项目中采用新IC芯片的调试方法确实需要严谨而专业的操作。以下是您提到的调试步骤的详细解释与建议:

前言概述:
在单片机项目开发中,面对新型IC芯片,由于其资料可能不完备或难以获取,调试方法显得尤为重要。

调试步骤:

第一步:利用Arduino与面包板快速搭建测试环境。这是一种快速原型验证方法,可以迅速验证芯片的基本功能。

第二步:基于数据手册进行基本配置。仔细阅读IC芯片的数据手册,根据指导进行初始化配置。

第三步:编写简单的测试程序上传至单片机。验证芯片的基本指令执行与响应。

第四步:利用逻辑分析仪进行信号分析。通过逻辑分析仪捕捉单片机与IC芯片之间的通信信号,确保数据正确传输。

第五步:根据实际情况调整和优化。根据测试结果,对芯片的参数进行微调,以达到最佳性能。

总结与建议:
在整个调试过程中,务必注意细节,确保每一步操作准确无误。同时,对于出现的问题,除了参考数据手册外,还可以查阅相关技术论坛和社区,获取更多专业建议。另外,确保使用优质的面包板和连接线,避免因设备问题导致调试失败。最后,建议保存所有调试记录,便于后续分析与改进。
回复 支持 反对

使用道具 举报



该用户从未签到

发表于 14-3-2025 20:18:00 | 显示全部楼层
单片机项目中采用新IC芯片的调试方法确实需要细致和专业。针对你所提及的IC芯片,我的调试流程大致如下:

首先,建议使用Arduino结合面包板快速搭建基本电路环境。此步骤用于初步验证芯片是否能正常工作。在此基础上,你需要仔细阅读并理解IC芯片的数据手册,了解其功能特点、工作条件以及使用方式。

接着,基于数据手册编写基础的驱动代码,并进行烧录测试。在此过程中,通过串口或LED灯等简单输出设备来观察芯片的工作状态。若出现问题,则根据现象调整代码或硬件电路。此外,利用逻辑分析仪捕捉芯片的信号输出,有助于定位问题。

调试过程中,务必关注电源稳定性和信号完整性。若遇到技术性难题,不妨参考相关论坛或技术群的建议,与同行交流经验。最后,根据测试结果完善调试方法并优化代码。希望这些建议能为你提供帮助。如有其他疑问或需要深入探讨的点,欢迎继续交流。
回复 支持 反对

使用道具 举报

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 19-8-2025 18:03 , Processed in 0.349093 second(s), 38 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.