0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

CHANBAEK 来源:想啥做啥 作者: wllis 2023-11-30 15:35 次阅读

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

前言:

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

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

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

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

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

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

IC型号:TLP0501

电压范围:2.7~5.5V

温度范围:-40~125℃

通信方式:SPI

阻值:100KΩ

阻值偏差:±20%

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

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

图片

环境参数

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

图片

功能框图

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

图片

引脚定义

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

图片

SPI通信说明

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

图片

真值对照表

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

芯片模块的快速制作

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

准备好芯片+转接板

图片

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

图片

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

图片

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

arduino快速搭建工程:

电路原理

图片

电路原理图

引脚对应关系:

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范围

图片

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

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

图片

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

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

图片

经过验证,在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;
int CLK_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建立一个工程

图片

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

图片

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

图片

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

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

图片

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 -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
/* USER CODE BEGIN PFP */


/* USER CODE END PFP */


/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void TLP0501_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
  */
int main(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
  */
void SystemClock_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
  */
static void MX_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
  */
void Error_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
  */
void assert_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 %drn", 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可以撤销;硬件在使用过程中出现意外损坏情况很正常:焊接不当、意外插错,静电防护不到位等等;我们要善于运用一些项目技巧,权衡时间或花费;这里之所以选择焊接两个芯片模块也是为了防止这种意外的发生而对调试造成不必要的时间耽搁。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 电路图
    +关注

    关注

    10215

    文章

    10645

    浏览量

    510983
  • 单片机
    +关注

    关注

    6001

    文章

    43973

    浏览量

    620836
  • IC芯片
    +关注

    关注

    8

    文章

    237

    浏览量

    25671
  • Arduino
    +关注

    关注

    184

    文章

    6427

    浏览量

    184834
  • 面包板
    +关注

    关注

    2

    文章

    296

    浏览量

    17432
收藏 人收藏

    评论

    相关推荐

    单片机项目研发经验分享

    开始做单片计算机产品设计研发工作至今。独立完成从原理图设计,PCB板制作,软件编程等,研发了30多个项目,并投入生产及销售。实际在项目中使用过如下方面内容:8位单片机应用, 16位
    发表于 05-23 10:29

    单片机IC芯片开发之刻蚀的作用

    如今,单片机IC芯片的制造不断追求更小化,以达到降低能耗、提高性能的目的。为了解决这一问题,新的芯片制造工艺设计应运而生,单片机
    发表于 08-23 17:34

    单片机教材书籍,王云51单片机C语言程序设计教程(pdf书本样章)

    `本书特色:本书巧妙地将对单片机原理的讲述与硬件实验设备结合起来,列举了大量有趣易懂的小例子,深入浅出地用实操案例来讲述单片机的工作原理、扩展知识、编程技巧,讲授单片机项目开发的流程及
    发表于 11-19 19:41

    【 平头哥CB5654语音开发板试用连载】基于单片机的类智能音箱产品

    项目名称:基于单片机的类智能音箱产品试用计划:1、申请理由 我毕业于电子类相关专业,毕业后在医疗行业从事基于单片机的嵌入式设计。从在校接触的51单片机到现在
    发表于 02-25 16:07

    单片机加密方法 相关资料分享

    单片机加密方法在最近一个项目中,急急忙忙把功能完成就给了客户,完全没有安全意识,现在用烧录器把Flash里的程序一读,我就慌了,完全没有加密,随随便便就把程序读出来了,那我干了一个月的活,被人家花
    发表于 07-01 08:23

    Keil5创建51单片机项目中CPU显示为空怎么解决?

    Keil5创建51单片机项目中CPU显示为空怎么解决?
    发表于 10-09 08:38

    STM32不同型号单片机keil工程移植方法

    STM32系列单片机如果库函数开发的话,那么不同型号单片机的工程是可以直接移植的。这样的话如果项目中更换了芯片,工程就可以直接移植过去,不用重新编写。这样就节约了很多时间。 下面说一下
    发表于 11-29 06:41

    单片机如何控制调试信息输出

    单片机调试log信息输出控制方法因子最近在研发公司项目:基于无线通信的****物联网应用。过程中涉及到了多个程序模块,包括MQTT、JSON解析、二维码生成等。在
    发表于 01-27 07:18

    单片机的在线调试方法

    本文主要讲述的是单片机的在线调试方法
    发表于 04-22 16:43 33次下载

    ARM单片机开发调试方法

    ARM单片机开发调试方法
    发表于 07-25 13:21 36次下载

    单片机程序常用的几种调试方法

    单片机程序常用的几种调试方法,这些调试方法都需要结合电脑上位机,以下我罗列一些调试
    发表于 07-17 09:31 1.2w次阅读

    Keil5创建51单片机项目中CPU显示为空

    Keil5创建51单片机项目中CPU显示为空
    发表于 11-23 16:36 12次下载
    Keil5创建51<b class='flag-5'>单片机</b><b class='flag-5'>项目中</b>CPU显示为空

    单片机控制调试信息输出的方法

    单片机调试log信息输出控制方法因子最近在研发公司项目:基于无线通信的****物联网应用。过程中涉及到了多个程序模块,包括MQTT、JSON解析、二维码生成等。在
    发表于 12-03 12:06 0次下载
    <b class='flag-5'>单片机</b>控制<b class='flag-5'>调试</b>信息输出的<b class='flag-5'>方法</b>

    单片机常用的调试方法

    单片机程序调试过程中,串口打印调试方法是非常重要的手段,在使用串口调试时,我们更多的是使用printf。但是下面我们不介绍printf,介
    的头像 发表于 04-04 14:58 3741次阅读

    单片机项目中LED的重要性

    单片机项目中LED的重要性
    的头像 发表于 09-18 16:19 642次阅读
    <b class='flag-5'>单片机</b><b class='flag-5'>项目中</b>LED的重要性