1、背景
上周完成了基本测试以后,发现了一个问题,串口虽然好用,但是现在的计算机支持力度不够好,另外,速度也慢,楼主想尽量把它做完善一点,用USB2.0, 115200以上的中速实现MLX90640红外数据传输,来重新实现这个32*24的红外测温硬件,经过一天努力,终于做好了,整体效果如下。
2、USB 驱动
对于这个东西,USB的驱动还是比较容易的,首先打开STM32CUBEMX, 选择USB设备,MIDDLEWARE中选择USB,选CDC,其他我都默认的,然后就是安装驱动包,测试,正常通过~
3、USB 驱动程序
接下来详细讲下怎么实现下位机的,为了实现USB版本的程序,我主要做了两件事,
其一,去官方下载了MLX90640的开发包文件mlx90640-library-master.zip,解压后,发现其实这个是提供了两个版本的,要筛检,MLX90640_I2C_Driver.h对应的两个C文件,一个是硬件IIC,一个是模拟IIC,大家都知道,STM32F103是模拟的IIC, 所以,我选择了MLX90640_SWI2C_Driver.cpp, 改为MLX90640_SWI2C_Driver.c,然后建立了工程如下图:
最难的一步到了,就是改配置:找到MLX90640_i2c_driver.h,修改IIC的那些宏变量段落,否则程序就找不到北了,甚至连个IICStart()都启动不起来,由于我的是F103的,GBIOB的变量里没有那么多高级货,我就直接按照标准库的例子开始一个函数一个函数对应修改了,基本如下:
#define SCL_PIN GPIO_PIN_6
#define SCL_GPIO_PORT GPIOB
#define SDA_PIN GPIO_PIN_7
#define SDA_GPIO_PORT GPIOB
#define SCL_HIGH HAL_GPIO_WritePin(SCL_GPIO_PORT , SCL_PIN, GPIO_PIN_SET)
#define SCL_LOW HAL_GPIO_WritePin(SCL_GPIO_PORT , SCL_PIN, GPIO_PIN_RESET)
#define SDA_HIGH HAL_GPIO_WritePin(SDA_GPIO_PORT , SDA_PIN, GPIO_PIN_SET)
#define SDA_LOW HAL_GPIO_WritePin(SDA_GPIO_PORT , SDA_PIN, GPIO_PIN_RESET)
#define SCL_read HAL_GPIO_ReadPin(SCL_GPIO_PORT , SCL_PIN)
#define SDA_read HAL_GPIO_ReadPin(SDA_GPIO_PORT , SDA_PIN)
有了这段定义,STM32F103驱动mlx90640的关键就搞定了,你如果示波器跟踪的话,就可以看见SCL&SDA的交互脉冲了。
当然,接下来收尾:
代码跟前面的类似:
。..。..。..。..。..。..。..。
while (1)
{
MLX90640_GetFrameData(MLX_I2C_ADDR, frame);
Ta = MLX90640_GetTa(frame, &mlx90640);
tr = Ta - TA_SHIFT;
MLX90640_CalculateTo(frame, &mlx90640, emissivity, tr, mlx90640To);
//LSB first, MSB behind
CheckCode=0x5A5A;
CheckCode+=0x0602;
for(i=0;i《768;i++)
{
UsartBuff[i*2+4]= (uint16_t)(mlx90640To[i]*100)&0xFF;
UsartBuff[i*2+5]= ((uint16_t)(mlx90640To[i]*100)》》8)&0xFF;
CheckCode+=(uint16_t)(mlx90640To[i]*100);
}
UsartBuff[1540]= (uint16_t)(Ta*100)&0xFF;
UsartBuff[1541]= ((uint16_t)(Ta*100)》》8)&0xFF;
CheckCode+=(uint16_t)(Ta*100);
UsartBuff[1542]= (uint16_t)CheckCode&0xFF;
UsartBuff[1543]= ((uint16_t)CheckCode》》8)&0xFF;
CDC_Transmit_FS(UsartBuff, 1544);
LEDFlash(1);
}
。..。..。..。..。..。..。..。
通过USB CDC通信,也就是CDC_Transmit_FS(UsartBuff, 1544),你可以发现,像MLX90640类似的数据量传输起来太容易了,速度快串口好多,另外就是便携多了,像我第一张图那样,感觉整个小装置很清爽,下一步,我看看能否再在上面驱动个普通的摄像头和FLASH,充分利用STM32的硬件。
1、背景
上周完成了基本测试以后,发现了一个问题,串口虽然好用,但是现在的计算机支持力度不够好,另外,速度也慢,楼主想尽量把它做完善一点,用USB2.0, 115200以上的中速实现MLX90640红外数据传输,来重新实现这个32*24的红外测温硬件,经过一天努力,终于做好了,整体效果如下。
2、USB 驱动
对于这个东西,USB的驱动还是比较容易的,首先打开STM32CUBEMX, 选择USB设备,MIDDLEWARE中选择USB,选CDC,其他我都默认的,然后就是安装驱动包,测试,正常通过~
3、USB 驱动程序
接下来详细讲下怎么实现下位机的,为了实现USB版本的程序,我主要做了两件事,
其一,去官方下载了MLX90640的开发包文件mlx90640-library-master.zip,解压后,发现其实这个是提供了两个版本的,要筛检,MLX90640_I2C_Driver.h对应的两个C文件,一个是硬件IIC,一个是模拟IIC,大家都知道,STM32F103是模拟的IIC, 所以,我选择了MLX90640_SWI2C_Driver.cpp, 改为MLX90640_SWI2C_Driver.c,然后建立了工程如下图:
最难的一步到了,就是改配置:找到MLX90640_i2c_driver.h,修改IIC的那些宏变量段落,否则程序就找不到北了,甚至连个IICStart()都启动不起来,由于我的是F103的,GBIOB的变量里没有那么多高级货,我就直接按照标准库的例子开始一个函数一个函数对应修改了,基本如下:
#define SCL_PIN GPIO_PIN_6
#define SCL_GPIO_PORT GPIOB
#define SDA_PIN GPIO_PIN_7
#define SDA_GPIO_PORT GPIOB
#define SCL_HIGH HAL_GPIO_WritePin(SCL_GPIO_PORT , SCL_PIN, GPIO_PIN_SET)
#define SCL_LOW HAL_GPIO_WritePin(SCL_GPIO_PORT , SCL_PIN, GPIO_PIN_RESET)
#define SDA_HIGH HAL_GPIO_WritePin(SDA_GPIO_PORT , SDA_PIN, GPIO_PIN_SET)
#define SDA_LOW HAL_GPIO_WritePin(SDA_GPIO_PORT , SDA_PIN, GPIO_PIN_RESET)
#define SCL_read HAL_GPIO_ReadPin(SCL_GPIO_PORT , SCL_PIN)
#define SDA_read HAL_GPIO_ReadPin(SDA_GPIO_PORT , SDA_PIN)
有了这段定义,STM32F103驱动mlx90640的关键就搞定了,你如果示波器跟踪的话,就可以看见SCL&SDA的交互脉冲了。
当然,接下来收尾:
代码跟前面的类似:
。..。..。..。..。..。..。..。
while (1)
{
MLX90640_GetFrameData(MLX_I2C_ADDR, frame);
Ta = MLX90640_GetTa(frame, &mlx90640);
tr = Ta - TA_SHIFT;
MLX90640_CalculateTo(frame, &mlx90640, emissivity, tr, mlx90640To);
//LSB first, MSB behind
CheckCode=0x5A5A;
CheckCode+=0x0602;
for(i=0;i《768;i++)
{
UsartBuff[i*2+4]= (uint16_t)(mlx90640To[i]*100)&0xFF;
UsartBuff[i*2+5]= ((uint16_t)(mlx90640To[i]*100)》》8)&0xFF;
CheckCode+=(uint16_t)(mlx90640To[i]*100);
}
UsartBuff[1540]= (uint16_t)(Ta*100)&0xFF;
UsartBuff[1541]= ((uint16_t)(Ta*100)》》8)&0xFF;
CheckCode+=(uint16_t)(Ta*100);
UsartBuff[1542]= (uint16_t)CheckCode&0xFF;
UsartBuff[1543]= ((uint16_t)CheckCode》》8)&0xFF;
CDC_Transmit_FS(UsartBuff, 1544);
LEDFlash(1);
}
。..。..。..。..。..。..。..。
通过USB CDC通信,也就是CDC_Transmit_FS(UsartBuff, 1544),你可以发现,像MLX90640类似的数据量传输起来太容易了,速度快串口好多,另外就是便携多了,像我第一张图那样,感觉整个小装置很清爽,下一步,我看看能否再在上面驱动个普通的摄像头和FLASH,充分利用STM32的硬件。
1
举报