DAC8568_SPI有数据输出
This commit is contained in:
parent
097fefd7e6
commit
3bcc5b8927
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
}
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
@ -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);
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue