Post Go back to editing

代码修改

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通信,请给予支持,看是否存在问题。