20230731_XiaoFuZi_emb/ZheDaXiaoFuZiBoot/Src/Usr/Driver/Ldrv/YS-OIW-Y516A/YsOiwY516A.c

202 lines
6.3 KiB
C
Raw Normal View History

#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(5000);
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;
}