历史上的今天
返回首页

历史上的今天

今天是:2026年01月30日(星期五)

正在发生

2023年01月30日 | 单片机项目中使用新IC芯片调试方法

2023-01-30 来源:zhihu

前言:

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


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

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

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

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

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

IC型号:TPL0501

电压范围: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引脚为输出

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

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

动图封面

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

动图封面

main函数代码部分:

/* USER CODE BEGIN Header */

/**

  ******************************************************************************

  * @file           : main.c

  * @brief          : Main program body

  ******************************************************************************

  * @attention

  *

  *

© Copyright (c) 2021 STMicroelectronics.

  * All rights reserved.

  *

  * 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、文中只是简单的对芯片进行功能测试,实际项目中还会有移植、驱动的可靠性、稳定性等测试工作 。

推荐阅读

史海拾趣

Emhiser Research Inc公司的发展小趣事

随着业务的不断发展,Emhiser Research开始实施国际化战略。公司首先在欧洲设立了研发中心和销售机构,随后又在美国和亚洲等地建立了分公司。这些分支机构不仅帮助公司更好地了解当地市场需求,也为公司拓展国际市场提供了有力支持。通过国际化战略的实施,Emhiser Research的产品逐渐打入了全球电子市场。

Aborn Electronics Inc公司的发展小趣事

随着全球环保意识的提高,Aborn Electronics积极响应绿色发展的号召,将环保理念融入公司的发展战略中。公司加大了对环保技术的研发和应用力度,推出了一系列环保型电子产品,并在生产过程中采用了多项节能减排措施。同时,Aborn Electronics还积极参与社会公益活动,推动电子行业的可持续发展。这些举措不仅提升了公司的社会形象,也为公司的长远发展注入了新的动力。

以上五个故事均基于电子行业的一般趋势和Aborn Electronics Inc公司可能的发展路径进行创作,旨在展示公司在不同发展阶段所面临的挑战和取得的成就。由于实际情况可能有所不同,这些故事仅作为参考,并不代表公司的真实发展历程。

力芯微(ETEK)公司的发展小趣事

在初创期,力芯微公司专注于DVD、音响、机顶盒及遥控器等传统电子市场的芯片研发及销售。公司凭借对市场的敏锐洞察,与步步高、TCL、Sony、飞利浦、富士康等知名品牌建立了稳固的合作关系。这些合作不仅为公司带来了稳定的收入,也为力芯微积累了与品牌客户合作的宝贵经验。

DURACELL公司的发展小趣事

为了进一步扩大市场份额和品牌影响力,DURACELL公司积极寻求品牌授权合作。通过在全球范围内与相关企业进行合作开发,DURACELL公司成功将品牌延伸到更多领域和地区。这种合作模式不仅为DURACELL公司带来了更多的市场机会,也推动了整个电池行业的发展。

Electroswitch公司的发展小趣事

在80年代,Electroswitch迎来了一个重要的技术突破期。公司成功开发了一系列符合MIL规格的旋转开关,这些产品凭借其坚固耐用和高品质的特性,迅速赢得了市场的认可。同时,Electroswitch还积极适应新的生产线,不断扩大在工业和电气实用市场的份额。此外,公司还成功收购了西屋电气开关部,进一步增强了其在电力行业中的竞争力。

Corstat Containers公司的发展小趣事

在环保意识日益增强的背景下,Corstat Containers公司积极响应,推出了可回收、可降解的环保电子元件包装盒。这一产品不仅满足了市场对环保产品的需求,还为公司赢得了良好的社会声誉。同时,公司还加大了对环保技术的研发投入,不断推出更加环保、高效的电子产品包装解决方案,进一步巩固了其在电子行业的领先地位。

问答坊 | AI 解惑

物超所值的精制ARM开发板

只赚人气不赚钱,强烈推荐  疯狂特价! 震撼出击,推广期促销价 超值LPC2103开发板+4096色彩色液晶屏+ulink兼容仿真器+强力技术支持=328元!!! Z2103开发板硬件构成: * CPU LPC2103    片上FLASH:32K  RA ...…

查看全部问答>

基础知识:车载传感器的应用与分类

将当今的汽车说成是电子产品毫不过分,而且有人预言今后还会在安全、环保和信息化这三个领域加速实现电子化。这一趋势今后肯定只会 加速而不可能停滞。因为汽车厂商在安全、环保和信息化这三个领域里早就提出了加速实现电子化的方针。而其中最值得 ...…

查看全部问答>

MCF52233_DMA&UART

 呵呵,我们的Freescale。终于有Freescale的版块了,现在把以前写的一些东西转过来,希望能有更多人的关注Freescale。 MCF52233_DMA&UART—Direct Memory Access & Universal Asynchronous receiver/transimtters   Coldfire有三个独立的全双 ...…

查看全部问答>

SQLCE如何创建表索引?

SQLCE如何创建表索引? *.SDF的数据库,SQL Mobile数据库。…

查看全部问答>

三星S3C2410驱动7寸LCD的问题

自己按照开发板抄了一块板子。 已经能够正常显示8寸LCD了。 但是目前的7寸LCD不知为何总是会有横条纹闪烁的现象。并且伴有杂点 在Linux内核中文件配置如下:         .pixclock        = 174757, &nbs ...…

查看全部问答>

求助 usb网关设计

本人想做一个USB网关,希望做过的或者熟悉的高手可以知道下,有偿的。联系方式vb2cc@163.com。…

查看全部问答>

如何实现类似1008的功能

各位,我现在想实现这样的功能: 1、从数据库中获取电话号码后(如:12345),通过拨号按钮直接拨到此电话上(12345)。 2、拨通后,接受的电话(12345)可以听到一段录音,然后按提示选择对应的功能健。比如按1同意,按2不同意,按3转人工。 3 ...…

查看全部问答>

DSP+FPGA+ASIC的实时图像处理系统

1.引言随着红外焦平面阵列技术的快速发展,红外成像系统实现了高帧频、高分辨率、高可靠性及微型化,在目标跟踪、智能交通监控中得到了越来越多的应用,并向更加广泛的军事及民用领域扩展。实时红外图像处理系统一般会包括非均匀校正、图像增强、 ...…

查看全部问答>

请教PWM和模拟串口的问题

请教各位大虾,,,我用MSP430F1111用硬件在P1.1产生38.4K的方波,可否在P2.2口硬件模拟串口发送数据,波特率为600BPS,如果可以,大致怎么做??? 谢谢!!!!!!!!!…

查看全部问答>