gd32与tmp423的使用以及mdk5的软件仿真

本文详细介绍了如何在GD32F103RE微控制器上使用TMP423温度传感器,包括寄存器配置、I2C时序控制和MDK5软件仿真的设置过程。作者分享了关键步骤和代码示例,适合GD32新手学习迁移STM32经验。
摘要由CSDN通过智能技术生成

gd32与tmp423的使用以及mdk5的软件仿真

简介

本文主要介绍在GD32f103RE上使用TMP423,以及MDK5的软件仿真使用,笔者经验不丰富,所以有错误请指正,主要为了记录笔记使用。

关于GD32

GD32是易兆创新的一款芯片,可以pin to pin兼容STM32,但是偶尔会有些地方需要作出改变,这里不赘述这些改变,笔者对GD32完美替换STM32也不是特别熟悉。

关于tmp423

  1. 引脚定义
    ①DXP1~3是接三个温度传感器,具体硬件不清楚,本文介绍软件。
    ②SCL和SDA接GD的I2C总线。
  2. 寄存器定义
    在这里插入图片描述表1
    tmp423的寄存器定义,这里关心两个地方:
    ①manufacturer ID
    manufacturer ID是出厂ID,读取这个ID以此判断是否存在tmp42x芯片以及I2C时序是否正确。及0x55为出厂制造商ID。
    ②Remote Temperature1~3的High Byte及Low Byte,这是存放温度值的寄存器。转换方式:
    在这里插入图片描述
    表2
    在这里插入图片描述
    表3
    表2是Remote Temperature寄存器的高字节的转换表,存放的是温度的整数位,表3是低字节的转换表,存放的是温度的低字节,其中看到有standard(标准)和extended(扩展)两种模式。其中标准模式可以读到-40°to127°,扩展模式可以读到-55°to150°。模式的转换方式是配置CONFIGURATION REGISTER 1寄存器的RANGE位即第二位。置0是标准模式,置1是扩展模式。
    本文使用的是标准模式,下文中高字节低字节即表示Remote Temperature寄存器的高低字节,标准模式的转换方法如下
    ①温度大于0
    温度大于0的情况很好换算,只需要将高字节(H)向左移4位加上低字节(L)右移四位乘0.0625即可得出结果。公式如下:
    ((H<<4)+(L>>4))*0.0625
    ②温度小于0
    判断温度大于或小于0的方法是高字节的最高位即第7位是0还是1,0即为正,1为负。换算方法是高字节取反加一(即高字节的补码)。然后高字节的补码左移4位加低字节右移4位乘0.0625最后加负号。公式如下:
    -((((~H+1)>>4)+(L>>4))*0.0625)

TMP423的其余寄存器和一些详细配置介绍等就麻烦自行查阅datasheet。

  1. I2C时序
    在这里插入图片描述
    读数据的时序这一块就根据datasheet中描述,首先一个I2C起始信号,然后从设备(tmp423)地址,末尾0为写,1为读。明显开始要写寄存器地址所以为1,然后等待一个ACK回应。然后就可以写入寄存器地址,再次等待一个ACK回应后又开始又开始一个I2C起始信号,从设备地址末尾为0等待一个ACK信号后读取寄存器数据,不发停止信号的话可以连续继续接着寄存器地址往后读。
    写时序类似这里就不贴出来了。

MDK软件仿真

MDK5可以软件仿真实现示波器的效果,笔者因为刚好在外出差调,所以没有示波器,并且因为使用的方式是GPIO模拟I2C时序,就尝试着用MDK仿真GD32,结果对于GD32F103RE来说是可以的,不知道其他型号是否需要配置或者改变什么。这里介绍下笔者的相关配置:
在这里插入图片描述首先点击DEBUG后点击红色框选中Logic Analyzer弹出逻辑分析框。
点击逻辑框左上角的setup
在这里插入图片描述
点击红色框弹出输入栏后输入PORTX.Y。
在这里插入图片描述建议选择bit和勾选Hexadecimal Display。否则可能会导致没有波形。
在这里插入图片描述
其中options中Debug的配置如上图,勾选红框,绿框的DLL选择如图所示的内容,根据自己的单片机型号进行改变。
在这里插入图片描述
成功输出模拟波形。

代码

这里贴一段读Manufacturer ID的代码

uint8_t tmp423_read_id()
{
  u8 id = 0;
  u8 addr = 0x4c;//从设备地址
  addr <<= 1;//写时序
  SDA_OUT();//SDA设置为输出
  IIC_Start();
  IIC_Send_Byte(addr);//从设备地址
  IIC_Wait_Ack();
  
  IIC_Send_Byte(0xfe);//写入寄存器地址
  IIC_Wait_Ack();

  IIC_Start();
  addr++;//读时序
  IIC_Send_Byte(addr);
  IIC_Wait_Ack();
  id = IIC_Read_Byte(0);//读出寄存器数据
  IIC_Wait_Ack();
  
  IIC_Stop();
  return id;
}

总结

以前用的STM32,现在由于一些原因可能很多用户都会改用GD32,笔者在这里只是作一个笔记的记录,如果不正确的地方望指正和谅解。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值