202 lines
6.3 KiB
C
202 lines
6.3 KiB
C
|
|
#include "YsOiwY516A.h"
|
||
|
|
#include <string.h>
|
||
|
|
#include <math.h>
|
||
|
|
|
||
|
|
#define YS_OIW_Y516A_READ_FLAG 0x10 // 表示写数据指令
|
||
|
|
#define YS_OIW_Y516A_WRITE_FLAG 0x03 // 表示读数据指令
|
||
|
|
|
||
|
|
/* YsChl515A初始化函数 */
|
||
|
|
int YsOiw516AInit(ys_oiw_y516a_dev *dev)
|
||
|
|
{
|
||
|
|
int rt = 0;
|
||
|
|
/* 设置ID */
|
||
|
|
rt = YsOiw516ASetDevAddr(dev);
|
||
|
|
if (rt < 0) {
|
||
|
|
return -1;
|
||
|
|
}
|
||
|
|
/* 设置校准值 */
|
||
|
|
rt = YsOiw516ASetDevCalib(dev);
|
||
|
|
if (rt < 0) {
|
||
|
|
return -1;
|
||
|
|
}
|
||
|
|
dev->DelayMs(2000);
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* 设置设备ID */
|
||
|
|
int YsOiw516ASetDevAddr(ys_oiw_y516a_dev *dev)
|
||
|
|
{
|
||
|
|
uint16_t Crc16 = 0xffff;
|
||
|
|
uint8_t wdata[11] = {0x01,0x10,0x30,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x00};
|
||
|
|
uint8_t rdata[8]= {0};
|
||
|
|
if (dev->OldDevAddr == dev->NewDevAddr) {
|
||
|
|
return 0; // 不需要设置
|
||
|
|
}
|
||
|
|
wdata[0] = (uint8_t)((dev->OldDevAddr) & 0x00ff); // 写入旧地址
|
||
|
|
wdata[7] = (uint8_t)((dev->NewDevAddr) & 0x00ff); // 写入新地址低位
|
||
|
|
wdata[8] = (uint8_t)(((dev->NewDevAddr) & 0xff00) >> 8); // 写入新地址高位
|
||
|
|
dev->Crc(wdata, 9, &Crc16);
|
||
|
|
wdata[9] = (uint8_t)(Crc16 & 0x00ff);
|
||
|
|
wdata[10] = (uint8_t)((Crc16 & 0xff00) >> 8);
|
||
|
|
dev->Write(wdata, sizeof(wdata));
|
||
|
|
dev->Read(rdata, sizeof(rdata));
|
||
|
|
/* 检验接收数据 */
|
||
|
|
if (rdata[0] != dev->OldDevAddr) {
|
||
|
|
return -1;
|
||
|
|
}
|
||
|
|
Crc16 = 0xffff;
|
||
|
|
dev->Crc(rdata, 6, &Crc16);
|
||
|
|
if (Crc16 != ((((uint16_t)rdata[7]) << 8) | rdata[6])) {
|
||
|
|
return -1;
|
||
|
|
}
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* 设置线性校验值 */
|
||
|
|
int YsOiw516ASetDevCalib(ys_oiw_y516a_dev *dev)
|
||
|
|
{
|
||
|
|
uint32_t TempK = 0;
|
||
|
|
uint32_t TempB = 0;
|
||
|
|
uint16_t Crc16 = 0xffff;
|
||
|
|
uint8_t wdata[17] = {0x01,0x10,0x11,0x00,0x00,0x04,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
|
||
|
|
uint8_t rdata[8] = {0};
|
||
|
|
memcpy(&TempK, &(dev->Calib.k), sizeof(uint32_t));
|
||
|
|
memcpy(&TempB, &(dev->Calib.b), sizeof(uint32_t));
|
||
|
|
wdata[0] = (uint8_t)((dev->NewDevAddr) & 0x00ff);
|
||
|
|
wdata[10] = (uint8_t)((TempK & 0xff000000) >> 24);
|
||
|
|
wdata[9] = (uint8_t)((TempK & 0x00ff0000) >> 16);
|
||
|
|
wdata[8] = (uint8_t)((TempK & 0x0000ff00) >> 8);
|
||
|
|
wdata[7] = (uint8_t)((TempK & 0x000000ff) >> 0);
|
||
|
|
wdata[14] = (uint8_t)((TempB & 0xff000000) >> 24);
|
||
|
|
wdata[13] = (uint8_t)((TempB & 0x00ff0000) >> 16);
|
||
|
|
wdata[12] = (uint8_t)((TempB & 0x0000ff00) >> 8);
|
||
|
|
wdata[11] = (uint8_t)((TempB & 0x000000ff) >> 0);
|
||
|
|
dev->Crc(wdata, 15, &Crc16);
|
||
|
|
wdata[15] = (uint8_t)(Crc16 & 0x00ff);
|
||
|
|
wdata[16] = (uint8_t)((Crc16 & 0xff00) >> 8);
|
||
|
|
dev->Write(wdata, sizeof(wdata));
|
||
|
|
dev->Read(rdata, sizeof(rdata));
|
||
|
|
/* 检验接收数据 */
|
||
|
|
if (rdata[0] != (uint8_t)((dev->NewDevAddr) & 0x00ff)) {
|
||
|
|
return -1;
|
||
|
|
}
|
||
|
|
Crc16 = 0xffff;
|
||
|
|
dev->Crc(rdata, 6, &Crc16);
|
||
|
|
if (Crc16 != ((((uint16_t)rdata[7]) << 8) | rdata[6])) {
|
||
|
|
return -1;
|
||
|
|
}
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* 开始测量 */
|
||
|
|
int YsOiw516ADevStartMeasure(ys_oiw_y516a_dev *dev)
|
||
|
|
{
|
||
|
|
uint16_t Crc16 = 0xffff;
|
||
|
|
uint8_t wdata[8] = {0x01,0x03,0x25,0x00,0x00,0x01,0x00,0x00};
|
||
|
|
uint8_t rdata[7] = {0};
|
||
|
|
wdata[0] = (uint8_t)((dev->NewDevAddr) & 0x00ff);
|
||
|
|
dev->Crc(wdata, 6, &Crc16);
|
||
|
|
wdata[6] = (uint8_t)(Crc16 & 0x00ff);
|
||
|
|
wdata[7] = (uint8_t)((Crc16 & 0xff00) >> 8);
|
||
|
|
dev->Write(wdata, sizeof(wdata));
|
||
|
|
dev->Read(rdata, sizeof(rdata));
|
||
|
|
if (rdata[0] != (uint8_t)((dev->NewDevAddr) & 0x00ff)) {
|
||
|
|
return -1;
|
||
|
|
}
|
||
|
|
Crc16 = 0xffff;
|
||
|
|
dev->Crc(rdata, 5, &Crc16);
|
||
|
|
if (Crc16 != ((((uint16_t)rdata[6]) << 8) | rdata[5])) {
|
||
|
|
return -1;
|
||
|
|
}
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* 停止测量 */
|
||
|
|
int YsOiw516ADevStopMeasure(ys_oiw_y516a_dev *dev)
|
||
|
|
{
|
||
|
|
uint16_t Crc16 = 0xffff;
|
||
|
|
uint8_t wdata[8] = {0x01,0x03,0x2E,0x00,0x00,0x01,0x00,0x00};
|
||
|
|
uint8_t rdata[7] = {0};
|
||
|
|
wdata[0] = (uint8_t)((dev->NewDevAddr) & 0x00ff);
|
||
|
|
dev->Crc(wdata, 6, &Crc16);
|
||
|
|
wdata[6] = (uint8_t)(Crc16 & 0x00ff);
|
||
|
|
wdata[7] = (uint8_t)((Crc16 & 0xff00) >> 8);
|
||
|
|
dev->Write(wdata, sizeof(wdata));
|
||
|
|
dev->Read(rdata, sizeof(rdata));
|
||
|
|
if (rdata[0] != (uint8_t)((dev->NewDevAddr) & 0x00ff)) {
|
||
|
|
return -1;
|
||
|
|
}
|
||
|
|
Crc16 = 0xffff;
|
||
|
|
dev->Crc(rdata, 5, &Crc16);
|
||
|
|
if (Crc16 != ((((uint16_t)rdata[6]) << 8) | rdata[5])) {
|
||
|
|
return -1;
|
||
|
|
}
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* 获取温度和水中油值 */
|
||
|
|
int YsOiw516ADevGetOiwAndTemp(ys_oiw_y516a_dev *dev, ys_oiw_y516a_data* data)
|
||
|
|
{
|
||
|
|
uint32_t temp1 = 0;
|
||
|
|
float temp2 = 0.0f;
|
||
|
|
uint16_t Crc16 = 0xffff;
|
||
|
|
uint8_t wdata[8] = {0x01,0x03,0x26,0x00,0x00,0x05,0x00,0x00};
|
||
|
|
uint8_t rdata[15] = {0};
|
||
|
|
wdata[0] = (uint8_t)((dev->NewDevAddr) & 0x00ff);
|
||
|
|
dev->Crc(wdata, 6, &Crc16);
|
||
|
|
wdata[6] = (uint8_t)(Crc16 & 0x00ff);
|
||
|
|
wdata[7] = (uint8_t)((Crc16 & 0xff00) >> 8);
|
||
|
|
dev->Write(wdata, sizeof(wdata));
|
||
|
|
dev->Read(rdata, sizeof(rdata));
|
||
|
|
if (rdata[0] != (uint8_t)((dev->NewDevAddr) & 0x00ff)) {
|
||
|
|
return -1;
|
||
|
|
}
|
||
|
|
Crc16 = 0xffff;
|
||
|
|
dev->Crc(rdata, 13, &Crc16);
|
||
|
|
if (Crc16 != ((((uint16_t)rdata[14]) << 8) | rdata[13])) {
|
||
|
|
return -1;
|
||
|
|
}
|
||
|
|
/* 获取温度值 */
|
||
|
|
if (data->TempIndex == YS_OIW_Y516A_DEV_ENABLE) {
|
||
|
|
temp1 = ((uint32_t)rdata[6] << 24) | ((uint32_t)rdata[5] << 16) |
|
||
|
|
((uint32_t)rdata[4] << 8) | ((uint32_t)rdata[3] << 0);
|
||
|
|
memcpy(&temp2, &temp1, sizeof(float));
|
||
|
|
data->Temp = temp2;
|
||
|
|
}
|
||
|
|
/* 获取水中油的值 */
|
||
|
|
if (data->OiwIndex == YS_OIW_Y516A_DEV_ENABLE) {
|
||
|
|
temp1 = ((uint32_t)rdata[10] << 24) | ((uint32_t)rdata[9] << 16) |
|
||
|
|
((uint32_t)rdata[8] << 8) | ((uint32_t)rdata[7] << 0);
|
||
|
|
memcpy(&temp2, &temp1, sizeof(float));
|
||
|
|
data->Oiw = temp2;
|
||
|
|
}
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* 获取软件和硬件版本 */
|
||
|
|
int YsOiw516ADevGetVersion(ys_oiw_y516a_dev *dev)
|
||
|
|
{
|
||
|
|
uint16_t Crc16 = 0xffff;
|
||
|
|
uint8_t wdata[8] = {0x01,0x03,0x07,0x00,0x00,0x02,0x00,0x00};
|
||
|
|
uint8_t rdata[9] = {0};
|
||
|
|
wdata[0] = (uint8_t)((dev->NewDevAddr) & 0x00ff);
|
||
|
|
dev->Crc(wdata, 6, &Crc16);
|
||
|
|
wdata[6] = (uint8_t)(Crc16 & 0x00ff);
|
||
|
|
wdata[7] = (uint8_t)((Crc16 & 0xff00) >> 8);
|
||
|
|
dev->Write(wdata, sizeof(wdata));
|
||
|
|
dev->Read(rdata, sizeof(rdata));
|
||
|
|
if (rdata[0] != (uint8_t)((dev->NewDevAddr) & 0x00ff)) {
|
||
|
|
return -1;
|
||
|
|
}
|
||
|
|
Crc16 = 0xffff;
|
||
|
|
dev->Crc(rdata, 7, &Crc16);
|
||
|
|
if (Crc16 != ((((uint16_t)rdata[8]) << 8) | rdata[7])) {
|
||
|
|
return -1;
|
||
|
|
}
|
||
|
|
dev->HdVer[0] = rdata[3];
|
||
|
|
dev->HdVer[1] = rdata[4];
|
||
|
|
dev->Soft[0] = rdata[5];
|
||
|
|
dev->Soft[1] = rdata[6];
|
||
|
|
return 0;
|
||
|
|
}
|