Category: Software
Product Number: LTC2662
#include "stm32f10x.h" #include "LTC2662.h" #include "stm32f10x_spi.h" #include "stm32f10x_rcc.h" #include "stm32f10x_gpio.h" #include <math.h> // 各范围的最小值和最大值 const float LTC2662_MIN_OUTPUT[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; const float LTC2662_MAX_OUTPUT[10] = {0.0, 3.125, 6.25, 12.5, 25.0, 50.0, 100.0, 200.0, 0, 300.0}; // SPI2初始化函数 void SPI2_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; // 使能GPIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); // 配置SPI2引脚:SCK, MISO 和 MOSI GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); // 配置CS引脚 GPIO_InitStructure.GPIO_Pin = LTC2662_CS_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); // SPI2配置 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master; SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial = 7; SPI_Init(SPI2, &SPI_InitStructure); // 使能SPI2 SPI_Cmd(SPI2, ENABLE); } // 向LTC2662写入16位dac_code int8_t LTC2662_write(uint8_t cs, uint8_t dac_command, uint8_t dac_address, uint16_t dac_code) { uint8_t data_array[4]; uint8_t rx_array[4]; int i; data_array[3] = 0; data_array[2] = dac_command | dac_address; data_array[1] = (uint8_t)(dac_code >> 8); data_array[0] = (uint8_t)(dac_code & 0xFF); // 选择LTC2662 GPIO_ResetBits(LTC2662_CS_PORT, LTC2662_CS_PIN); for (i = 0; i < 4; i++) { // 通过SPI外设发送字节 SPI_I2S_SendData(SPI2, data_array[i]); // 等待接收一个字节 while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET); // 获取接收到的字节 rx_array[i] = SPI_I2S_ReceiveData(SPI2); } // 取消选择LTC2662 GPIO_SetBits(LTC2662_CS_PORT, LTC2662_CS_PIN); return rx_array[3]; } // 计算LTC2662 DAC码,给定所需的输出电流 uint16_t LTC2662_current_to_code(float dac_current, float max_output) { uint16_t dac_code; float float_code; float_code = 65535.0 * dac_current / max_output; float_code = (float_code > (floor(float_code) + 0.5)) ? ceil(float_code) : floor(float_code); if (float_code < 0.0) float_code = 0.0; if (float_code > 65535.0) float_code = 65535.0; dac_code = (uint16_t)(float_code); return dac_code; } // 计算LTC2662 DAC输出电流,给定DAC码和最大输出 float LTC2662_code_to_current(uint16_t dac_code, float max_output) { float dac_current; dac_current = ((float)dac_code / 65535.0) * max_output; return dac_current; } #ifndef LTC2662_H #define LTC2662_H #include <stdint.h> // 定义SPI2 CS引脚 #define LTC2662_CS_PIN GPIO_Pin_12 #define LTC2662_CS_PORT GPIOB // LTC2662命令码 #define LTC2662_CMD_WRITE_N 0x00 #define LTC2662_CMD_UPDATE_N 0x10 #define LTC2662_CMD_WRITE_N_UPDATE_ALL 0x20 #define LTC2662_CMD_WRITE_N_UPDATE_N 0x30 #define LTC2662_CMD_POWER_DOWN_N 0x40 #define LTC2662_CMD_POWER_DOWN_ALL 0x50 #define LTC2662_CMD_SPAN 0x60 #define LTC2662_CMD_CONFIG 0x70 #define LTC2662_CMD_WRITE_ALL 0x80 #define LTC2662_CMD_UPDATE_ALL 0x90 #define LTC2662_CMD_WRITE_ALL_UPDATE_ALL 0xA0 #define LTC2662_CMD_MUX 0xB0 #define LTC2662_CMD_TOGGLE_SEL 0xC0 #define LTC2662_CMD_GLOBAL_TOGGLE 0xD0 #define LTC2662_CMD_SPAN_ALL 0xE0 #define LTC2662_CMD_NO_OPERATION 0xF0 // LTC2662范围码 #define LTC2662_SPAN_HI_Z 0x0000 #define LTC2662_SPAN_3_125MA 0x0001 #define LTC2662_SPAN_6_25MA 0x0002 #define LTC2662_SPAN_12_5MA 0x0003 #define LTC2662_SPAN_25MA 0x0004 #define LTC2662_SPAN_50MA 0x0005 #define LTC2662_SPAN_100MA 0x0006 #define LTC2662_SPAN_200MA 0x0007 #define LTC2662_SPAN_SW_TO_NEG_V 0x0008 #define LTC2662_SPAN_300MA 0x000F // 各范围的最小值和最大值 extern const float LTC2662_MIN_OUTPUT[10]; extern const float LTC2662_MAX_OUTPUT[10]; // 配置选项 #define LTC2662_REF_DISABLE 0x0001 #define LTC2662_THERMAL_SHUTDOWN 0x0002 #define LTC2662_POWERLIMIT_PROTECTION 0x0003 #define LTC2662_OPEN_CIRCUIT_DETECT_DISABLE 0x0004 // 全局切换 #define LTC2662_TOGGLE_REG_A 0x0000 #define LTC2662_TOGGLE_REG_B 0x0010 // 函数原型 int8_t LTC2662_write(uint8_t cs, uint8_t dac_command, uint8_t dac_address, uint16_t dac_code); uint16_t LTC2662_current_to_code(float dac_current, float max_output); float LTC2662_code_to_current(uint16_t dac_code, float max_output); void SPI2_Init(void); #endif // LTC2662_H
这是没有编译错误的C语言代码,但是不是使LTC2662输出电流,使用的是SPI2通信,请给予支持,看是否存在问题。