DAC8568_SPI有数据输出

This commit is contained in:
qiuxin 2025-05-29 17:36:09 +08:00
parent 097fefd7e6
commit 3bcc5b8927
14 changed files with 381 additions and 116 deletions

View File

@ -139,10 +139,10 @@ extern "C"
#define DO_CH3_GPIO_Port GPIOD
#define DO_CH1_Pin GPIO_PIN_13
#define DO_CH1_GPIO_Port GPIOD
#define DO_CH2_Pin GPIO_PIN_14
#define DO_CH2_GPIO_Port GPIOD
#define DO_EN_Pin GPIO_PIN_15
#define DO_EN_GPIO_Port GPIOD
// #define DO_CH2_Pin GPIO_PIN_14
// #define DO_CH2_GPIO_Port GPIOD
// #define DO_EN_Pin GPIO_PIN_15
// #define DO_EN_GPIO_Port GPIOD
#define DI_CH1_Pin GPIO_PIN_8
#define DI_CH1_GPIO_Port GPIOC
#define DI_CH2_Pin GPIO_PIN_9
@ -157,8 +157,8 @@ extern "C"
#define DI_CH4_GPIO_Port GPIOA
//LCD串口引脚
#define LCD_TX_Pin GPIO_PIN_10
#define LCD_TX_GPIO_Port GPIOC
// #define LCD_TX_Pin GPIO_PIN_10
// #define LCD_TX_GPIO_Port GPIOC
#define LCD_RX_Pin GPIO_PIN_11
#define LCD_RX_GPIO_Port GPIOC
//hart1发送引脚
@ -168,8 +168,8 @@ extern "C"
#define HART_CLK_GPIO_Port GPIOA
#define HART1_RST_Pin GPIO_PIN_8
#define HART1_RST_GPIO_Port GPIOC
#define HART1_TX_Pin GPIO_PIN_12
#define HART1_TX_GPIO_Port GPIOC
// #define HART1_TX_Pin GPIO_PIN_12
// #define HART1_TX_GPIO_Port GPIOC
#define HART_RTS_Pin GPIO_PIN_1
#define HART_RTS_GPIO_Port GPIOD
#define HART1_OCD_Pin GPIO_PIN_0
@ -197,6 +197,15 @@ extern "C"
#define DAC1_MOSI_GPIO_Port GPIOB
#define DAC1_MISO_Pin GPIO_PIN_4
#define DAC1_MISO_GPIO_Port GPIOB
//DAC8568引脚定义
#define DAC8568_CS_Pin GPIO_PIN_15
#define DAC8568_CS_GPIO_Port GPIOD
#define DAC8568_SCLK_Pin GPIO_PIN_10
#define DAC8568_SCLK_GPIO_Port GPIOC
#define DAC8568_DIN_Pin GPIO_PIN_12
#define DAC8568_DIN_GPIO_Port GPIOC
#define DAC8568_LD_Pin GPIO_PIN_14
#define DAC8568_LD_GPIO_Port GPIOD
#define ADC_CS_Pin GPIO_PIN_0
#define ADC_CS_GPIO_Port GPIOE

View File

@ -44,6 +44,7 @@
#include <string.h> // 添加string.h用于字符串操作
#include "ht1200m.h"
#include "TCA6416.h" // 添加TCA6416头文件
#include "DAC8568.h"
// 声明外部变量
extern ad7124_analog_t ad7124_analog[AD7124_CHANNEL_EN_MAX];
@ -76,6 +77,7 @@ osThreadId ad7124_test_taskHandle;
osThreadId usart6_test_taskHandle; // 添加USART6测试任务句柄
osThreadId tca6416_taskHandle; // 添加TCA6416任务句柄
osThreadId dac161s997_test_taskHandle; // 添加DAC161S997测试任务句柄
osThreadId dac8568_test_taskHandle; // 添加DAC8568测试任务句柄
// 添加调试变量
static volatile uint32_t uart6_dr_raw = 0; // UART数据寄存器的原始值
@ -145,6 +147,7 @@ void start_usart6_test_task(void const *argument); // 添加USART6测试任务
void start_tca6416_task(void const *argument); // 添加TCA6416任务函数声明
void test_tca6416_task(void const *argument); // 添加TCA6416测试任务函数声明
void start_dac161s997_test_task(void const *argument); // 添加DAC161S997测试任务函数声明
void start_dac8568_test_task(void const *argument); // 添加DAC8568测试任务函数声明
/* USER CODE END FunctionPrototypes */
void start_tcp_task(void const *argument);
@ -186,54 +189,15 @@ void MX_FREERTOS_Init(void)
{
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* USER CODE BEGIN RTOS_MUTEX */
/* add mutexes, ... */
/* USER CODE END RTOS_MUTEX */
/* USER CODE BEGIN RTOS_SEMAPHORES */
/* add semaphores, ... */
/* USER CODE END RTOS_SEMAPHORES */
/* USER CODE BEGIN RTOS_TIMERS */
/* start timers, add new ones, ... */
/* USER CODE END RTOS_TIMERS */
/* USER CODE BEGIN RTOS_QUEUES */
/* add queues, ... */
/* USER CODE END RTOS_QUEUES */
/* Create the thread(s) */
/* definition and creation of lwip_task */
osThreadDef(lwip_task, start_tcp_task, osPriorityHigh, 0, 512);
lwip_taskHandle = osThreadCreate(osThread(lwip_task), NULL);
/* definition and creation of led_task */
// osThreadDef(led_task, start_led_toggle_task, osPriorityLow, 0, 128);
// led_taskHandle = osThreadCreate(osThread(led_task), NULL);
/* definition and creation of dac_task */
// osThreadDef(dac_task, start_dac_task, osPriorityNormal, 0, 512);
// dac_taskHandle = osThreadCreate(osThread(dac_task), NULL);
osThreadDef(adc_task, start_adc_task, osPriorityBelowNormal, 0, 128);
adc_taskHandle = osThreadCreate(osThread(adc_task), NULL);
/* definition and creation of adc_task */
// osThreadDef(adc_task, start_adc_task, osPriorityBelowNormal, 0, 128);
// adc_taskHandle = osThreadCreate(osThread(adc_task), NULL);
/* definition and creation of gpio_di_do_task */
//osThreadDef(gpio_di_do_task, start_gpio_di_do_task, osPriorityNormal, 0, 128);
//gpio_di_do_taskHandle = osThreadCreate(osThread(gpio_di_do_task), NULL);
/* definition and creation of ec11_task */
// osThreadDef(ec11_task, start_ec11_task, osPriorityNormal, 0, 512);
// ec11_taskHandle = osThreadCreate(osThread(ec11_task), NULL);
/* definition and creation of ad7124_test_task */
// osThreadDef(ad7124_test_task, start_ad7124_test_task, osPriorityNormal, 0, 512);
// ad7124_test_taskHandle = osThreadCreate(osThread(ad7124_test_task), NULL);
/* HART测试任务 */
osThreadDef(usart6_test_task, start_usart6_test_task, osPriorityNormal, 0, 128);
@ -244,12 +208,15 @@ void MX_FREERTOS_Init(void)
// tca6416_taskHandle = osThreadCreate(osThread(tca6416_task), NULL);
/* TCA6416测试任务 */
osThreadDef(tca6416_task, test_tca6416_task, osPriorityNormal, 0, 128);
tca6416_taskHandle = osThreadCreate(osThread(tca6416_task), NULL);
/* DAC161S997测试任务 */
osThreadDef(dac161s997_test_task, start_dac161s997_test_task, osPriorityNormal, 0, 128);
dac161s997_test_taskHandle = osThreadCreate(osThread(dac161s997_test_task), NULL);
// osThreadDef(dac161s997_test_task, start_dac161s997_test_task, osPriorityNormal, 0, 128);
// dac161s997_test_taskHandle = osThreadCreate(osThread(dac161s997_test_task), NULL);
/* DAC8568测试任务 */
osThreadDef(dac8568_test_task, start_dac8568_test_task, osPriorityLow, 0, 256);
dac8568_test_taskHandle = osThreadCreate(osThread(dac8568_test_task), NULL);
/* USER CODE BEGIN RTOS_THREADS */
/* add threads, ... */
/* USER CODE END RTOS_THREADS */
@ -824,4 +791,45 @@ void start_dac161s997_test_task(void const *argument)
osDelay(100);
}
/* USER CODE END start_dac161s997_test_task */
}
/* USER CODE BEGIN Header_start_dac8568_test_task */
/**
* @brief Function implementing the dac8568_test_task thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_start_dac8568_test_task */
void start_dac8568_test_task(void const *argument)
{
/* USER CODE BEGIN start_dac8568_test_task */
static float test_voltage = 0.0f; // 测试电压值
static uint8_t channel = 0; // 当前测试通道
static TickType_t last_update_time = 0;
TickType_t current_time;
// 等待系统稳定
osDelay(100);
// // 初始化DAC8568
DAC8568_Init();
osDelay(100);
// SPI3裸发测试
uint8_t test_tx[4] = {0xAA, 0x55, 0xFF, 0x00};
uint8_t test_rx[4] = {0};
for (;;) {
// 拉低CS
HAL_GPIO_WritePin(DAC8568_CS_GPIO_Port, DAC8568_CS_Pin, GPIO_PIN_RESET);
// 发送数据
HAL_SPI_TransmitReceive(&hspi3, test_tx, test_rx, 4, 1000);
// 拉高CS
HAL_GPIO_WritePin(DAC8568_CS_GPIO_Port, DAC8568_CS_Pin, GPIO_PIN_SET);
osDelay(10);
}
/* Infinite loop */
/* USER CODE END start_dac8568_test_task */
}

View File

@ -112,7 +112,7 @@ void MX_GPIO_Init(void)
HAL_GPIO_Init(ENCODE_Z_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pins : PDPin PDPin PDPin PDPin */
GPIO_InitStruct.Pin = DO_CH4_Pin|DO_CH3_Pin|DO_CH1_Pin|DO_CH2_Pin;
// GPIO_InitStruct.Pin = DO_CH4_Pin|DO_CH3_Pin|DO_CH1_Pin|DO_CH2_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
@ -222,14 +222,14 @@ void MX_GPIO_Init(void)
/* USER CODE BEGIN 2 */
void gpio_do_test(uint8_t gpio_num, GPIO_PinState state)
{
HAL_GPIO_WritePin(DO_EN_GPIO_Port, DO_EN_Pin, GPIO_PIN_RESET);
// HAL_GPIO_WritePin(DO_EN_GPIO_Port, DO_EN_Pin, GPIO_PIN_RESET);
switch (gpio_num)
{
case DO_1:
HAL_GPIO_WritePin(DO_CH1_GPIO_Port, DO_CH1_Pin, state);
break;
case DO_2:
HAL_GPIO_WritePin(DO_CH2_GPIO_Port, DO_CH2_Pin, state);
//HAL_GPIO_WritePin(DO_CH2_GPIO_Port, DO_CH2_Pin, state);
break;
case DO_3:
HAL_GPIO_WritePin(DO_CH3_GPIO_Port, DO_CH3_Pin, state);

View File

@ -127,6 +127,7 @@ int main(void)
MX_GPIO_Init();
//MX_DMA_Init();
dac161s997_spi_init();
dac8568_spi_init();
//MX_TIM3_Init();
//MX_SPI1_Init();
MX_USART6_UART_Init();

View File

@ -25,7 +25,8 @@
/* USER CODE END 0 */
SPI_HandleTypeDef hspi1;
SPI_HandleTypeDef hspi2;
SPI_HandleTypeDef hspi3;
/* SPI1 init function */
void MX_SPI1_Init(void)
{

View File

@ -236,7 +236,7 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
PC10 ------> UART4_TX
PC11 ------> UART4_RX
*/
GPIO_InitStruct.Pin = LCD_TX_Pin|LCD_RX_Pin;
//GPIO_InitStruct.Pin = LCD_TX_Pin|LCD_RX_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
@ -301,12 +301,12 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
PC12 ------> UART5_TX
PD2 ------> UART5_RX
*/
GPIO_InitStruct.Pin = HART1_TX_Pin;
//GPIO_InitStruct.Pin = HART1_TX_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF8_UART5;
HAL_GPIO_Init(HART1_TX_GPIO_Port, &GPIO_InitStruct);
//HAL_GPIO_Init(HART1_TX_GPIO_Port, &GPIO_InitStruct);
GPIO_InitStruct.Pin = HART1_RX_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
@ -632,7 +632,7 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
PC10 ------> UART4_TX
PC11 ------> UART4_RX
*/
HAL_GPIO_DeInit(GPIOC, LCD_TX_Pin|LCD_RX_Pin);
//HAL_GPIO_DeInit(GPIOC, LCD_TX_Pin|LCD_RX_Pin);
/* UART4 DMA DeInit */
HAL_DMA_DeInit(uartHandle->hdmarx);
@ -656,7 +656,7 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
PC12 ------> UART5_TX
PD2 ------> UART5_RX
*/
HAL_GPIO_DeInit(HART1_TX_GPIO_Port, HART1_TX_Pin);
//HAL_GPIO_DeInit(HART1_TX_GPIO_Port, HART1_TX_Pin);
HAL_GPIO_DeInit(HART1_RX_GPIO_Port, HART1_RX_Pin);

View File

@ -1973,6 +1973,18 @@
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>11</GroupNumber>
<FileNumber>133</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\User\driver\DAC8568.c</PathWithFileName>
<FilenameWithoutPath>DAC8568.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
@ -1983,7 +1995,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>12</GroupNumber>
<FileNumber>133</FileNumber>
<FileNumber>134</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1995,7 +2007,7 @@
</File>
<File>
<GroupNumber>12</GroupNumber>
<FileNumber>134</FileNumber>
<FileNumber>135</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -2007,7 +2019,7 @@
</File>
<File>
<GroupNumber>12</GroupNumber>
<FileNumber>135</FileNumber>
<FileNumber>136</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -2019,7 +2031,7 @@
</File>
<File>
<GroupNumber>12</GroupNumber>
<FileNumber>136</FileNumber>
<FileNumber>137</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -2031,7 +2043,7 @@
</File>
<File>
<GroupNumber>12</GroupNumber>
<FileNumber>137</FileNumber>
<FileNumber>138</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -2051,7 +2063,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>13</GroupNumber>
<FileNumber>138</FileNumber>
<FileNumber>139</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -2063,7 +2075,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
<FileNumber>139</FileNumber>
<FileNumber>140</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -2075,7 +2087,7 @@
</File>
<File>
<GroupNumber>13</GroupNumber>
<FileNumber>140</FileNumber>
<FileNumber>141</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>

View File

@ -1093,6 +1093,11 @@
<FileType>1</FileType>
<FilePath>..\User\application\src\TCA6416.c</FilePath>
</File>
<File>
<FileName>DAC8568.c</FileName>
<FileType>1</FileType>
<FilePath>..\User\driver\DAC8568.c</FilePath>
</File>
</Files>
</Group>
<Group>

96
User/driver/DAC8568.c Normal file
View File

@ -0,0 +1,96 @@
#include "DAC8568.h"
#include "stm32f4xx_hal.h" // 添加HAL库头文件
#include "main.h"
#include "user_spi.h"
#include <stdint.h> // 添加标准整型定义
#define DAC_MAX_VALUE 65535
/**
* @brief DAC8568通用写函数
* @param cmd 0-1-DAC值
* @param channel (0-7)cmd=1
* @param value DAC值(0-65535)cmd决定
* @return void
*/
void DAC8568_Write(uint8_t cmd, uint8_t channel, uint32_t value)
{
uint8_t tx_data[4];
uint8_t rx_data[4] = {0}; // Initialize receive buffer
uint32_t send_data;
// 根据命令类型准备发送数据
if(cmd == 0) // 初始化内部参考电压
{
send_data = DAC8568_EN_INTER_REF_STATIC;
}
else // 写入并更新DAC值
{
// 输入参数合法性检查
if(channel > 7)
{
channel = 7;
}
if(value > DAC_MAX_VALUE)
{
value = DAC_MAX_VALUE;
}
send_data = DAC8568_WRITE_UPDATE_SEL_DAC;
send_data |= (channel << 20);
send_data |= (value << 4);
}
// 准备发送数据
tx_data[0] = (uint8_t)(send_data >> 24);
tx_data[1] = (uint8_t)(send_data >> 16);
tx_data[2] = (uint8_t)(send_data >> 8);
tx_data[3] = (uint8_t)(send_data & 0xFF);
// 开始SPI传输
DAC8568_CS_L; // 拉低CS使能SPI接口
extern SPI_HandleTypeDef hspi3; // 声明外部SPI句柄
spi_transmit_receive(&hspi3, tx_data, rx_data, 4); // 使用hspi3发送4字节数据
DAC8568_CS_H; // 拉高CS禁止SPI接口
}
/**
* @brief DAC8568芯片
* @return void
*/
void DAC8568_Init(void)
{
//初始化GPIO和SPI
dac8568_spi_init();
// 将LDAC置低DAC8568处于同步模式
DAC8568_LD_L;
// 初始化内部参考电压
DAC8568_Write(0, 0, 0);
}
/**
* @brief DAC8568指定通道的电压值
* @param mCh (0-7)
* @param mVol (0-2.5V)
* @return void
*/
void dac8568_set_voltage(unsigned char mCh, float mVol)
{
float mDatafloat;
uint16_t mDtashort;
// 将电压值转换为DAC值
mDatafloat = mVol * (65536/(5*1.91));
mDtashort = (uint16_t)mDatafloat;
mDtashort &= 0xffff;
// 限制DAC值范围
if(mDtashort > 65535)
mDtashort = 65535;
// 写入并更新DAC值
DAC8568_Write(1, mCh, mDtashort);
}

62
User/driver/DAC8568.h Normal file
View File

@ -0,0 +1,62 @@
#include "stm32f4xx_hal.h" // 添加HAL库头文件
#include "main.h"
/************************DA8568寄存器SR的值*****************************/
#define PrefixControlbyte 0x03//前缀控制字节
#define AddressOutA 0x0//通道A地址
#define AddressOutB 0x1//通道B地址
#define AddressOutC 0x2//通道C地址
#define AddressOutD 0x3//通道D地址
#define AddressOutE 0x4//通道E地址
#define AddressOutF 0x5//通道F地址
#define AddressOutG 0x6//通道G地址
#define AddressOutH 0x7//通道H地址
#define Featurebyte 0x0//特征字节
/*****DA8568寄存器SR的值-结尾*************************************/
/****************************DAC8568命令************************/
#define SETUP_INTERNAL_REGISTER 0
#define POWER_UP 1
#define RESET 2
/*****DAC8568命令-结尾*******************************************/
//---------------------------------------- Pin definition
//---------------------------------------- Command definition
#define DAC8568_EN_INTER_REF_STATIC 0x08000001
#define DAC8568_WRITE_UPDATE_SEL_DAC 0x03000000
//---------------------------------------- Reference Voltage
#define DAC8568_REF_VOLTAGE 2.5
void DAC8568_Init(void);
void DAC8568_Write_Update_Sel_DAC(uint32_t ChannelNum, uint32_t DACValue);
// #define DAC8568_SYNC_H GPIO_SetBits(GPIOA,GPIO_Pin_15)
// #define DAC8568_SYNC_L GPIO_ResetBits(GPIOA,GPIO_Pin_15)
// #define DAC8568_SCLK_H GPIO_SetBits(GPIOC,GPIO_Pin_10)
// #define DAC8568_SCLK_L GPIO_ResetBits(GPIOC,GPIO_Pin_10)
// #define DAC8568_DIN_H GPIO_SetBits(GPIOC,GPIO_Pin_12)
// #define DAC8568_DIN_L GPIO_ResetBits(GPIOC,GPIO_Pin_12)
//引脚拉高拉低
#define DAC8568_CS_H HAL_GPIO_WritePin(DAC8568_CS_GPIO_Port, DAC8568_CS_Pin, GPIO_PIN_SET)
#define DAC8568_CS_L HAL_GPIO_WritePin(DAC8568_CS_GPIO_Port, DAC8568_CS_Pin, GPIO_PIN_RESET)
#define DAC8568_SCLK_H HAL_GPIO_WritePin(DAC8568_SCLK_GPIO_Port, DAC8568_SCLK_Pin, GPIO_PIN_SET)
#define DAC8568_SCLK_L HAL_GPIO_WritePin(DAC8568_SCLK_GPIO_Port, DAC8568_SCLK_Pin, GPIO_PIN_RESET)
#define DAC8568_DIN_H HAL_GPIO_WritePin(DAC8568_DIN_GPIO_Port, DAC8568_DIN_Pin, GPIO_PIN_SET)
#define DAC8568_DIN_L HAL_GPIO_WritePin(DAC8568_DIN_GPIO_Port, DAC8568_DIN_Pin, GPIO_PIN_RESET)
#define DAC8568_LD_H HAL_GPIO_WritePin(DAC8568_LD_GPIO_Port, DAC8568_LD_Pin, GPIO_PIN_SET)
#define DAC8568_LD_L HAL_GPIO_WritePin(DAC8568_LD_GPIO_Port, DAC8568_LD_Pin, GPIO_PIN_RESET)
void dac8568_init(void);
void dac8568_set_voltage(unsigned char mCh,float mVol);
void SPI_SendByte(uint8_t m);
void DAC8568_Write_passageway(uint8_t Addressbyte, uint16_t Datashort);
void DAC8568_Write_Command(uint8_t command);
void dac8568_set_voltage(unsigned char mCh, float mVol);
void dac8568_spi_init(void);
void DAC8568_Init(void);
void dac8568_output_ch0_1v5(void);

View File

@ -415,9 +415,10 @@ int32_t ad7124_setup(void)
int32_t ad7124_read_write_spi(uint8_t *buff, uint8_t length)
{
int32_t ret;
uint8_t rx_buff[8] = {0}; // Add receive buffer
board_spi_init(AD7124); // 初始化SPI,因为DAC161的SPI要和AD7124共用并且时序不一样所以要先初始化SPI接口。
board_spi_cs_on(AD7124);
ret = spi_transmit_receive(&hspi1, buff, length);
ret = spi_transmit_receive(&hspi1, buff, rx_buff, length);
board_spi_cs_off(AD7124);
return ret;
}

View File

@ -35,11 +35,12 @@ volatile uint32_t dac161s997_spi_retry_count = 0;
// 添加SPI通信辅助函数
static int32_t dac161s997_spi_transaction(uint8_t *data, uint8_t bytes, uint32_t timeout)
{
uint8_t rx_data[4] = {0}; // Add receive buffer
// 拉低CS
HAL_GPIO_WritePin(DAC1_CS_GPIO_Port, DAC1_CS_Pin, GPIO_PIN_RESET);
osDelay(5);
// SPI传输
int32_t status = spi_transmit_receive(&hspi1, data, bytes);
int32_t status = spi_transmit_receive(&hspi1, data, rx_data, bytes);
// 拉高CS
HAL_GPIO_WritePin(DAC1_CS_GPIO_Port, DAC1_CS_Pin, GPIO_PIN_SET);
@ -199,7 +200,7 @@ void dac161s997_output(dac_type_t dac_type, float current)
data_buffer[2] = dac_code;
dac161s997_init(dac_type, current);
HAL_GPIO_WritePin(DAC1_CS_GPIO_Port, DAC1_CS_Pin, GPIO_PIN_RESET);
spi_transmit_receive(&hspi1, data_buffer, 3);
spi_transmit_receive(&hspi1, data_buffer, data_buffer, 3);
HAL_GPIO_WritePin(DAC1_CS_GPIO_Port, DAC1_CS_Pin, GPIO_PIN_SET);
}

View File

@ -1,23 +1,58 @@
#include "user_spi.h"
#include "stm32f4xx_hal.h"
#include "stm32f4xx_hal_gpio_ex.h" // GPIO复用功能定义
#include "stm32f4xx_hal_spi.h" // SPI外设定义
#include "stm32f4xx_hal_rcc.h" // RCC时钟定义
#include "stm32f4xx_hal_def.h" // 基本类型定义
#include "stm32f4xx_hal_rcc_ex.h" // RCC扩展定义
#include "stm32f4xx_hal_gpio.h" // GPIO定义
#include "stm32f4xx_hal_conf.h" // HAL配置
#include "main.h"
#include <stdint.h>
#include <string.h>
#include <stdint.h>
#include <string.h>
#include "DAC8568.h"
#include "spi.h"
// 移除对platform_support.h的依赖
// 直接在此处定义需要的常量和函数
// 定义基本类型
typedef volatile uint32_t __IO;
// 定义常量
#define SUCCESS 0
#define FAILURE -1
// 声明mdelay函数
static inline void mdelay(uint32_t ms)
{
HAL_Delay(ms);
}
// 定义SPI缓冲区
static uint8_t spi_rx_buffer[256]; // 接收缓冲区
// SPI句柄声明
extern SPI_HandleTypeDef hspi1; // 在spi.c中定义
extern SPI_HandleTypeDef hspi2; // 在main.c中定义
extern SPI_HandleTypeDef hspi3; // 在main.c中定义
// 定义GPIO端口
// #define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800)
// #define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400)
// #define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00)
// #define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)
// #define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)
// #define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)
// // 定义SPI外设
// #define SPI2_BASE (APB1PERIPH_BASE + 0x3800)
// #define SPI2 ((SPI_TypeDef *) SPI2_BASE)
// // 定义SPI寄存器位
// #define SPI_CR1_MSTR_Pos 2
// #define SPI_CR1_CPOL_Pos 1
// #define SPI_CR1_CPHA_Pos 0
// #define SPI_CR1_SSI_Pos 8
// #define SPI_CR1_SSM_Pos 9
// #define SPI_CR1_BR_Pos 3
// #define SPI_CR1_MSTR (1 << SPI_CR1_MSTR_Pos)
// #define SPI_CR1_CPOL (1 << SPI_CR1_CPOL_Pos)
// #define SPI_CR1_CPHA (1 << SPI_CR1_CPHA_Pos)
// #define SPI_CR1_SSI (1 << SPI_CR1_SSI_Pos)
// #define SPI_CR1_SSM (1 << SPI_CR1_SSM_Pos)
// #define SPI_CR1_BR_2 (1 << (SPI_CR1_BR_Pos + 2))
/******************************************************************************/
/***************************** #defines ***************************************/
@ -30,44 +65,19 @@ static inline void mdelay(uint32_t ms)
/************************ Variable Declarations *******************************/
/******************************************************************************/
static uint8_t spi_rx_buffer[SPI_BUFFER_SIZE] = {0};
// SPI handle declaration
extern SPI_HandleTypeDef hspi1; // 在spi.c中定义
/******************************************************************************/
/************************ Functions Definitions *******************************/
/******************************************************************************/
#define SPI_BUFFER_SIZE 255
// SPI handle declaration
extern SPI_HandleTypeDef hspi1; // 在spi.c中定义
SPI_HandleTypeDef hspi2;
// Define return values
#define SUCCESS 0
#define FAILURE -1
// int32_t spi_transmit_receive(SPI_HandleTypeDef *hspi, uint8_t *data_write, uint8_t bytes_number)
// {
// // 使用 HAL_SPI_TransmitReceive 函数进行 SPI 通信
// if (HAL_SPI_TransmitReceive(&hspi2, data_write, (uint8_t *)spi_rx_buffer, bytes_number, 1000) != HAL_OK)
// {
// // 如果通信失败,返回 FAILURE
// return FAILURE;
// }
// /* 将 SPI 接收缓冲区复制到提供的数据缓冲区,以便返回给调用者 */
// memcpy(data_write, spi_rx_buffer, bytes_number);
// // 返回 SUCCESS 表示通信成功
// return SUCCESS;
// }
int32_t spi_transmit_receive(SPI_HandleTypeDef *hspi, uint8_t *data_write, uint8_t bytes_number)
int32_t spi_transmit_receive(SPI_HandleTypeDef *hspi, uint8_t *data_write, uint8_t *data_read, uint8_t bytes_number)
{
if (HAL_SPI_TransmitReceive(hspi, data_write, (uint8_t *)spi_rx_buffer, bytes_number, 1000) != HAL_OK)
if (HAL_SPI_TransmitReceive(hspi, data_write, data_read, bytes_number, 1000) != HAL_OK)
{
return FAILURE;
}
memcpy(data_write, spi_rx_buffer, bytes_number);
return SUCCESS;
}
@ -105,9 +115,7 @@ void ad7124_spi_init(void)
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
// Ensure CS is high before SPI initialization
// Configure SPI2 with the working configuration
// Configure SPI2
hspi2.Instance = SPI2;
hspi2.Init.Mode = SPI_MODE_MASTER;
hspi2.Init.Direction = SPI_DIRECTION_2LINES;
@ -115,7 +123,7 @@ void ad7124_spi_init(void)
hspi2.Init.CLKPolarity = SPI_POLARITY_HIGH; // CPOL = 1
hspi2.Init.CLKPhase = SPI_PHASE_2EDGE; // CPHA = 1
hspi2.Init.NSS = SPI_NSS_SOFT;
hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128;
hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
@ -133,6 +141,65 @@ void ad7124_spi_init(void)
HAL_Delay(1);
}
void dac8568_spi_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 使能SPI3和GPIO时钟
__HAL_RCC_SPI3_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
// 配置SPI3引脚 (PC10-SCK, PC12-MOSI)
GPIO_InitStruct.Pin = GPIO_PIN_10 | GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF6_SPI3;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
// 配置CS引脚 (PD15)
GPIO_InitStruct.Pin = DAC8568_CS_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP; // 添加上拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF6_SPI3;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
// 配置LDAC引脚 (PD14)
GPIO_InitStruct.Pin = DAC8568_LD_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP; // 添加上拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
// 配置SPI3
hspi3.Instance = SPI3;
hspi3.Init.Mode = SPI_MODE_MASTER;
hspi3.Init.Direction = SPI_DIRECTION_2LINES;
hspi3.Init.DataSize = SPI_DATASIZE_8BIT;
hspi3.Init.CLKPolarity = SPI_POLARITY_LOW; // CPOL = 0
hspi3.Init.CLKPhase = SPI_PHASE_1EDGE; // CPHA = 0
hspi3.Init.NSS = SPI_NSS_SOFT;
hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; // 提高SPI速度
hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi3.Init.TIMode = SPI_TIMODE_DISABLE;
hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi3.Init.CRCPolynomial = 10;
if (HAL_SPI_Init(&hspi3) != HAL_OK)
{
Error_Handler();
}
// 初始化CS和LDAC引脚状态
HAL_GPIO_WritePin(DAC8568_CS_GPIO_Port, DAC8568_CS_Pin, GPIO_PIN_SET); // CS初始为高电平
HAL_GPIO_WritePin(DAC8568_LD_GPIO_Port, DAC8568_LD_Pin, GPIO_PIN_RESET); // LDAC初始为低电平
// 等待一段时间确保DAC8568稳定
HAL_Delay(10);
}
void dac161s997_spi_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
@ -272,7 +339,7 @@ void board_spi_cs_off(chip_type_e chip_type)
int32_t ad7124_spi_transmit_receive(uint8_t *data, uint8_t bytes)
{
ad7124_cs_on();
int32_t result = spi_transmit_receive(&hspi2, data, bytes);
int32_t result = spi_transmit_receive(&hspi2, data, spi_rx_buffer, bytes);
ad7124_cs_off();
return result;
}

View File

@ -12,9 +12,10 @@ typedef enum
DAC8568 = 2,
} chip_type_e; // 芯片类型
extern int32_t spi_transmit_receive(SPI_HandleTypeDef *hspi, uint8_t *data_write, uint8_t bytes_number);
extern int32_t spi_transmit_receive(SPI_HandleTypeDef *hspi, uint8_t *data_write, uint8_t *data_read, uint8_t bytes_number);
extern SPI_HandleTypeDef hspi1;
extern SPI_HandleTypeDef hspi2;
extern SPI_HandleTypeDef hspi3;
extern void board_spi_init(chip_type_e chip_type);
extern void board_spi_cs_on(chip_type_e chip_type);
extern void board_spi_cs_off(chip_type_e chip_type);
@ -22,6 +23,7 @@ extern void board_spi_cs_off(chip_type_e chip_type);
void dac161s997_cs_on(uint8_t dac_num);
void dac161s997_cs_off(uint8_t dac_num);
void dac161s997_spi_init(void);
void dac8568_spi_init(void);
void ad7124_cs_off(void);
void ad7124_cs_on(void);