gd32与tmp423的使用以及mdk5的软件仿真
简介
本文主要介绍在GD32f103RE上使用TMP423,以及MDK5的软件仿真使用,笔者经验不丰富,所以有错误请指正,主要为了记录笔记使用。
关于GD32
GD32是易兆创新的一款芯片,可以pin to pin兼容STM32,但是偶尔会有些地方需要作出改变,这里不赘述这些改变,笔者对GD32完美替换STM32也不是特别熟悉。
关于tmp423
- 引脚定义
①DXP1~3是接三个温度传感器,具体硬件不清楚,本文介绍软件。
②SCL和SDA接GD的I2C总线。 - 寄存器定义
表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。
- 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,笔者在这里只是作一个笔记的记录,如果不正确的地方望指正和谅解。