polarimeter_software/User/driver/sv630p/h0c_comm.c
2025-09-30 10:37:23 +08:00

259 lines
8.0 KiB
C

/*
* @Date: 2025-07-01 09:47:13
* @Author: mypx
* @LastEditors: mypx mypx_coder@163.com
* @LastEditTime: 2025-07-22 10:18:57
* @FilePath: h0c_comm.c
* @Description:
* Copyright (c) 2025 by mypx, All Rights Reserved.
*/
#include "h0c_comm.h"
extern nmbs_t servo_nmbs;
/*==========================
* H0C Group - Communication Parameters (200C-xxh)
*==========================*/
/**
* @brief H0C.00 Read Drive Axis Address (16-bit)
* @param value Pointer to store the axis address (1-247)
* @return nmbs_error
* @note The drive axis address must be consistent with the host configuration
*/
nmbs_error sv630p_read_axis_address(uint16_t *value)
{
return nmbs_read_holding_registers(&servo_nmbs, REG_H0C_00_AXIS_ADDR, 1, value);
}
/**
* @brief H0C.00 Write Drive Axis Address (16-bit)
* @param value Axis address to write (1-247)
* @return nmbs_error
* @note Change when stopped, takes effect immediately
*/
nmbs_error sv630p_write_axis_address(uint16_t value)
{
if (value < H0C_00_MIN || value > H0C_00_MAX)
return NMBS_ERROR_INVALID_ARGUMENT;
return nmbs_write_single_register(&servo_nmbs, REG_H0C_00_AXIS_ADDR, value);
}
/**
* @brief H0C.02 Read Serial Baud Rate Setting (16-bit)
* @param value Pointer to store the baud rate setting (0-6)
* @return nmbs_error
* @note 0:2400bps, 1:4800bps, 2:9600bps, 3:19200bps, 4:38400bps, 5:57600bps, 6:115200bps
*/
nmbs_error sv630p_read_baud_rate(SV630P_BaudRate *baud_rate)
{
nmbs_error err;
uint16_t value;
err = nmbs_read_holding_registers(&servo_nmbs, REG_H0C_02_BAUD_RATE, 1, &value);
if (err == NMBS_ERROR_NONE)
{
if (value > SV630P_BAUD_115200)
err = NMBS_ERROR_INVALID_ARGUMENT;
else
*baud_rate = value;
}
return err;
}
/**
* @brief H0C.02 Write Serial Baud Rate Setting (16-bit)
* @param value Baud rate setting to write (0-6)
* @return nmbs_error
* @note Communication will be interrupted after modification, serial port needs to be re-initialized
*/
nmbs_error sv630p_write_baud_rate(SV630P_BaudRate baud_rate)
{
uint16_t value = (uint16_t)baud_rate;
return nmbs_write_single_register(&servo_nmbs, REG_H0C_02_BAUD_RATE, value);
}
/**
* @brief H0C.03 Read Modbus Communication Data Format (16-bit)
* @param value Pointer to store the data format (0-3)
* @return nmbs_error
* @note 0:No parity+2 stop bits, 1:Even parity+1 stop bit, 2:Odd parity+1 stop bit, 3:No parity+1 stop bit
*/
nmbs_error sv630p_read_modbus_data_format(SV630P_ModbusFormat *fmt)
{
nmbs_error err;
uint16_t value;
err = nmbs_read_holding_registers(&servo_nmbs, REG_H0C_03_DATA_FORMAT, 1, &value);
if (err == NMBS_ERROR_NONE)
{
if (value > SV630P_MODBUS_ODD_1STOP)
err = NMBS_ERROR_INVALID_ARGUMENT;
else
*fmt = value;
}
return err;
}
/**
* @brief H0C.03 Write Modbus Communication Data Format (16-bit)
* @param value Data format to write (0-3)
* @return nmbs_error
* @note Must be consistent with the host computer, otherwise communication will fail. Takes effect immediately.
*/
nmbs_error sv630p_write_modbus_data_format(SV630P_ModbusFormat fmt)
{
if (fmt < SV630P_MODBUS_NONE_1STOP || fmt > SV630P_MODBUS_ODD_1STOP)
return NMBS_ERROR_INVALID_ARGUMENT;
return nmbs_write_single_register(&servo_nmbs, REG_H0C_03_DATA_FORMAT, (uint16_t)fmt);
}
/**
* @brief H0C.08 Read CAN Communication Rate (16-bit)
* @param value Pointer to store the CAN rate setting (0-7)
* @return nmbs_error
* @note 0:20K, 1:50K, 2:100K, 3:125K, 4:250K, 5:500K, 6:1M(80% sample), 7:1M(70% sample)
*/
nmbs_error sv630p_read_can_rate(uint16_t *value)
{
return nmbs_read_holding_registers(&servo_nmbs, REG_H0C_08_CAN_RATE, 1, value);
}
/**
* @brief H0C.08 Write CAN Communication Rate (16-bit)
* @param value CAN rate setting to write (0-7)
* @return nmbs_error
* @note Only supports CANlink/CANopen communication, must be consistent with the host
*/
nmbs_error sv630p_write_can_rate(uint16_t value)
{
return nmbs_write_single_register(&servo_nmbs, REG_H0C_08_CAN_RATE, value);
}
/**
* @brief Read communication VDI enable status
* @param[out] value 0=disable, 1=enable
* @return nmbs_error
* @note After enabling VDI, DI function must be defined with H17 group parameters
*/
nmbs_error sv630p_read_vdi_enable(uint16_t *value)
{
return nmbs_read_holding_registers(&servo_nmbs, REG_H0C_09_VDI_ENABLE, 1, value);
}
/**
* @brief Set communication VDI enable status
* @param[in] value 0=disable, 1=enable
* @return nmbs_error
* @note Value range: H0C_09_MIN ~ H0C_09_MAX
*/
nmbs_error sv630p_write_vdi_enable(VDI_StatusTypeDef status)
{
uint16_t value = status;
return nmbs_write_single_register(&servo_nmbs, REG_H0C_09_VDI_ENABLE, value);
}
/*==========================
* H0C.10: Default VDI value after power-on (200C-0Bh)
*==========================*/
/**
* @brief Read default VDI value after power-on
* @param[out] value Default VDI level configuration, bit0 corresponds to VDI1
* @return nmbs_error
*/
nmbs_error sv630p_read_vdi_default(uint16_t *value)
{
return nmbs_read_holding_registers(&servo_nmbs, REG_H0C_10_VDI_DEFAULT, 1, value);
}
/**
* @brief Set default VDI value after power-on
* @param[in] value Default VDI level configuration, bit0 corresponds to VDI1
* @return nmbs_error
* @note Value range: H0C_10_MIN ~ H0C_10_MAX
*/
nmbs_error sv630p_write_vdi_default(uint16_t value)
{
return nmbs_write_single_register(&servo_nmbs, REG_H0C_10_VDI_DEFAULT, value);
}
/*==========================
* H0C.11: Communication VDO Enable (200C-0Ch)
*==========================*/
/**
* @brief Read communication VDO enable status
* @param[out] value 0=disable, 1=enable
* @return nmbs_error
* @note After enabling VDO, DO function must be defined with H31 group parameters
*/
nmbs_error sv630p_read_vdo_enable(uint16_t *value)
{
return nmbs_read_holding_registers(&servo_nmbs, REG_H0C_11_VDO_ENABLE, 1, value);
}
/**
* @brief Set communication VDO enable status
* @param[in] value 0=disable, 1=enable
* @return nmbs_error
* @note Value range: H0C_11_MIN ~ H0C_11_MAX
*/
nmbs_error sv630p_write_vdo_enable(uint16_t value)
{
// if (value < H0C_11_MIN || value > H0C_11_MAX) {
// return NMBS_ERROR_INVALID_ARGUMENT;
// }
return nmbs_write_single_register(&servo_nmbs, REG_H0C_11_VDO_ENABLE, value);
}
/*==========================
* H0C.12: Default VDO level when function is disabled (200C-0Dh)
*==========================*/
/**
* @brief Read default output level when VDO function is disabled
* @param[out] value Default output level
* @return nmbs_error
*/
nmbs_error sv630p_read_vdo_default_level(uint16_t *value)
{
return nmbs_read_holding_registers(&servo_nmbs, REG_H0C_12_VDO_DEFAULT_LEVEL, 1, value);
}
/**
* @brief Set default output level when VDO function is disabled
* @param[in] value Default output level
* @return nmbs_error
* @note Value range: H0C_12_MIN ~ H0C_12_MAX
*/
nmbs_error sv630p_write_vdo_default_level(uint16_t value)
{
// if (value < H0C_12_MIN || value > H0C_12_MAX) {
// return NMBS_ERROR_INVALID_ARGUMENT;
// }
return nmbs_write_single_register(&servo_nmbs, REG_H0C_12_VDO_DEFAULT_LEVEL, value);
}
/*==========================
* H0C.13: Communication function code EEPROM update (200C-0Eh)
*==========================*/
/**
* @brief Read whether communication function code is updated to EEPROM
* @param[out] value 0=not updated, 1=updated
* @return nmbs_error
*/
nmbs_error sv630p_read_func_code_eeprom(uint16_t *value)
{
return nmbs_read_holding_registers(&servo_nmbs, REG_H0C_13_FUNC_CODE_EEPROM, 1, value);
}
/**
* @brief Set whether communication function code is updated to EEPROM
* @param[in] value 0=not updated, 1=updated
* @return nmbs_error
* @note Value range: H0C_13_MIN ~ H0C_13_MAX
*/
nmbs_error sv630p_write_func_code_eeprom(uint16_t value)
{
// if (value < H0C_13_MIN || value > H0C_13_MAX) {
// return NMBS_ERROR_INVALID_ARGUMENT;
// }
return nmbs_write_single_register(&servo_nmbs, REG_H0C_13_FUNC_CODE_EEPROM, value);
}