stm32 - 无法使用 SPI 与 DAC 通信
问题描述
我正在尝试使用来自我的 STM32L4 控制器的 SPI与我的DAC通信。我基本上想测试 SPI 线路是否工作正常。即我是否能够分别向 DAC 传输数据和从 DAC 接收数据。我已将 DAC 引脚配置如下 -
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = RST_Pin|M_Z_Pin|TC_SB_Pin|LDAC_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Pin = PD_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_InitStruct.Pin = SPI3_Chip_Select_DAC_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pins : READY_Pin LDAC_Pin BUSY_Pin */
GPIO_InitStruct.Pin = READY_Pin|BUSY_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_WritePin(RST_GPIO_Port,RST_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(M_Z_GPIO_Port,M_Z_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(TC_SB_GPIO_Port,TC_SB_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(LDAC_GPIO_Port,LDAC_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(PD_GPIO_Port,PD_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(SPI3_Chip_Select_DAC_GPIO_Port,SPI3_Chip_Select_DAC_Pin,GPIO_PIN_SET);
}
我想读取状态寄存器的内容,我必须在 SPI 线上发送 0xC0(如数据表中所述)。作为回报,DAC 返回状态寄存器的内容。因此,我为此编写了以下代码-
SPI_HandleTypeDef hspi1;
SPI_HandleTypeDef hspi2;
SPI_HandleTypeDef hspi3;
TIM_HandleTypeDef htim3;
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USB_OTG_FS_USB_Init(void);
static void MX_SPI1_Init(void);
static void MX_SPI2_Init(void);
static void MX_SPI3_Init(void);
static void MX_TIM3_Init(void);
uint8_t received_data[3],Data_to_send[3];
int main(void)
{
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_SPI1_Init();
MX_SPI2_Init();
MX_SPI3_Init();
MX_TIM3_Init();
while(1)
{
HAL_GPIO_WritePin(SPI3_Chip_Select_DAC_GPIO_Port,SPI3_Chip_Select_DAC_Pin,GPIO_PIN_RESET);
HAL_Delay(1);
Data_for_try[0]=0xC0;
HAL_SPI_TransmitReceive(&hspi3,Data_to_send,received_data,3,100);
HAL_Delay(1);
HAL_GPIO_WritePin(SPI3_Chip_Select_DAC_GPIO_Port,SPI3_Chip_Select_DAC_Pin,GPIO_PIN_SET);
}
}
但我无法从 DAC 取回任何数据作为确认。我已经检查了 SPI_CLOCK 和 SPI_MOSI 引脚是否正在使用示波器获取信号。有什么方法可以检查 DAC 是否工作正常?
解决方案
感谢您的支持,但我能够找出问题所在。我必须按如下方式更改 SPI 设置 -
static void MX_SPI3_Init(void)
{
/* SPI3 parameter configuration*/
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;
hspi3.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi3.Init.NSS = SPI_NSS_SOFT;
hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi3.Init.TIMode = SPI_TIMODE_DISABLE;
hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi3.Init.CRCPolynomial = 7;
hspi3.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
hspi3.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
if (HAL_SPI_Init(&hspi3) != HAL_OK)
{
Error_Handler();
}
}
被 hspi3.Init.DataSize
初始化为SPI_DATASIZE_4BIT
而不是SPI_DATASIZE_8BIT
问题。
推荐阅读
- firebase - 颤振断言错误:颤振:'package:firebase_auth_platform_interface/src/method_channel/method_channel_user_credential.dart':断言失败
- swiftui - SwiftUI 中的 UITabViewController 的 Tab 的 OnAppear 被调用了两次
- javascript - 如何处理来自第三方的未处理拒绝?
- java - 这是 Java 中 Currying 的有效示例吗
- python - Pandas - 根据哪一列不为空,在新列中填充值
- javascript - 使用 HTML、CSS 和 JS 单击一次后的按钮组验证和禁用按钮组
- reactjs - 如何在 React Router 中使用受保护的功能映射路由?
- html - 当我选择其他表单下拉列表时,我想出现一个文本框
- python - Flask-sqlalchemy AttributeError:'function'对象没有属性'query'
- c# - 如何使用 X509Certificate2 向 httpweb 请求添加证书