主题中讨论的其他器件: DAC8775
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
JP1到 JP8我一直保持在内部位置。
已安装 JP9和 JP11,但未安装 JP13。
AVDD =+15V。
AVSS 接地。
DVDD 通过 USB-DIG 供电。输入 FFFF 通道上的输出为、
通道1–7.471 (4 - 20mA)
通道2–7.33V (0 -10V)
通道3–3.903V (0 - 5V)
CH4–7.15 (0-20mA)
Naveen、
当 DAC8775的输出不工作时、通常是由于漏电配置、例如降压/升压未加电、或者内部基准未启用。 我刚刚为 EVM 通电、您可以复制我的步骤以使用该器件。 下面是我的设置图片。 我认为所有跳线都是默认设置、但您可以快速查看。
首先、我使用 TP18和接地测试点为器件加电(我有削波导线电缆、比将两根导线拧入端子更容易。 然后、我使用 GUI 顶部中心的 RESET 按钮对 EVM GUI 进行复位。 我首先通过查看 VPOS_IN_A 和 VNEG_IN_A 来检查降压/升压转换器 这些电压应该大约为 TP1:+3.4V、TP2:+0.14V、并且 EVM 应该汲取大约4mA 的电流。
然后、在 GUI 的右上角、我将"Buck-Boost All (所有降压-升压)"设置为"All Enabled (全部启用)"。 这会设置 TP1:+4.1V、TP2:-5.6V。 在 GUI 的左上角、我将"Reference Out"设置为"Enabled"。 我想您可以使用电路板中心的 TP17来测量基准。 它应该为5.0V。
然后、我启用 DAC 输出 A。DAC 在 GUI 上默认处于0-5V 输出模式。 通道 A 的输出在 TP31处测量。 通过启用 DAC、您应该只处于0000h、并且输出应该为0V。 然后、我将 DAC 代码设置为1000h、以查看输出、并看到电压变为0.312V。
然后、您可以测试电流输出。 首先、我将跳线 J19设置为分流器。 这会将249Ω Ω 的负载连接到 VOUTA。 使用 DAC 输出 A 的模式、我可以将输出范围设置为4-20mA。 这确实会将 DAC 数据设置回0000h (即使认为它不会报告它、它仍然显示为1000h)。 当249Ω Ω 负载处于4-20mA 范围时、我测量 TP31的电压输出为0.986V。 再说一次、这是 DAC 数据设置为0000h 的情况。 为了确保我可以将 DAC 数据重写为1000h、输出将跳至大约1.25V。
我要注意的是、器件中有一个并联电阻负载、可以关断。 GUI 左上角是断电条件设置。 它将并联 VOUT 负载设置为30kΩ Ω。 由于每个通道上的 VOUT 和 IOUT 连接在一起、因此输出会看到该额外负载。 您可以使用该下拉设置将其设置为高阻态以移除负载。
吴约瑟
我上电时检查输入电压是否正确、然后我重置检查了降压升压器电压是否正确、然后我启用了降压升压器并检查了 TP1 - TP8上的电压、如上所述、这是正确的
然后、我按如下方式配置通道
通道1–4 - 20mA
CH2–0 -10V
通道3–0 - 5V
通道4–0-20mA
启用前三个通道后、电压电平为
输入电压 AVDD 为+15V。
VPOS _Channel_A = 4.889V 且 VNEG_Channel_A =-0.29V
VPOS _Channel_B = 15.32V 且 VNEG_Channel_B = 0.25V
VPOS _Channel_C = 15.39V 且 VNEG_Channel_C = 0.22V
VPOS _Channel_D = 4.159V 且 VNEG_Channel_D =-0.06V
基准电压为+4.992V。
此时 Vout 和 Iout 正确。
现在、我将万用表连接到第四个通道、我启用了第四个通道并向其写入 FFFF、
在该输出电压和输出电流错误后、读取配置为4-20mA 和0-20mA 的警报通道 A 和 D 会显示一些故障。
我读回故障寄存器0x0B、它返回的值为1739 ->因此意味着通道 A 故障和通道 D 故障。
TP1到 TP8之间的输出为
VPOS _Channel_A = 3.207V 且 VNEG_Channel_A =-0.019V
VPOS _Channel_B = 10.33V 且 VNEG_Channel_B =-0.121V
VPOS _Channel_C = 10.53V 且 VNEG_Channel_C = 0.121V
VPOS _Channel_D = 3.467A& VNEG_Channel_D=-0.09V
TP17中读取的基准电压为+3.962V。
输入电压降至+3.992V。
为什么我无法在输出电压和输出电流中获得正确的输出电压? 您能帮我解决这个问题吗?
谢谢、此致、
Naveen
Naveen、
很抱歉、我误解了您的问题。 我认为这是一个基本的设置问题。 但是、即使重新阅读您的帖子、我也不确定设置中的错误。 您的电源电流是否受限? 如果电源电流受限且未正确为电源供电、我可能会看到输出错误。 您正在使用哪种电源? 当输出出错时、您可以使用万用表读回电源吗?
此外、我还不理解您在第一篇帖子中的内容。 您曾提到:"当我正确配置4个通道时、输入电源会降至 Vin/4。 即 Vin = 15、因此15/4为其3.8V、但对于三个通道、馈入 EVM 的输出保持为+15V。" 什么是3.8V? 是 VPOS_IN_x 电压吗? 还是用于 PVDD 的电压?
当您将通道设置为电流输出时、负载是多少? 您是否在电路板上使用了其中一个电阻器? 其中一个可选负载电阻器为249Ω Ω、因此输出电流为20mA、输出电压约为5V。
当然、我已经设置了电路板以复制您的设置。 我将通道1设置为4-20mA、通道2设置为0-10V、通道3设置为0-5V、通道4设置为0-20mA。 然后、我将所有 DAC 设置为所有输出的 FFFF。 我通过不插入任何分流器将电压输出设置为空载、并且将电流输出设置为249Ω μ A、但为 JP19和 JP37插入分流器。 对于所有输出、我得到了正确的值。 通道1、3和4读取的电压约为5V、而通道2读取的电压为10V。 电源电压为15V、电流约为53mA。
如果这是限流电源问题、并且电流输出导致了这一问题、我将通过将所有输出设置为电流输出、然后将 FFFF 设置为所有输出来对其进行测试。 如果是这种情况、那么在启用两个通道后、电源可能会受到限制。 请注意、您需要添加一些负载所有输出。 如果对所有输出使用249Ω Ω 负载、然后对所有通道将输出设置为20mA、则电源在15V 时将使用大约72mA 的电流。
吴约瑟
您好、Joseph、
我尝试将 DAC8775EVM 与 STM32H753 Nucleo 板相连、现在我更改了跳线、现在我卸载了 JP9并安装了 JP11和 JP13、并提供了+5V 的外部电源。
我为 DAC8775EVM 编写了驱动程序代码并对其进行了刷写、所有通道的输出为0V。
我将 AVDD 电源和 DVDD 电源范围限定为+15V 和+4.89V,但降压转换器上的电压为+0.05V V Posx 和 GND,从电源汲取的电流为0mA。
然后、我再次尝试将 USB-DIG 连接到评估板 、并安装了 JP9、JP11并移除了 JP13。 现在我再次尝试使用评估软件、但复位后、降压转换器上的电压为+0.05V、 从电源汲取的电流为0mA。
#include "main.h" #include <stdio.h> enum Operation { RSTREG = 0x01, // Reset RESETCONFIGREG = 0x02, // Reset Config Registerf DACREGISTER = 0x03, DACCFGREGISTER = 0x04, DATAREGISTER = 0x05, BUCKBOOSTREG = 0x06, BUCKBOOSTCFGREG = 0x07, STATUSREG = 0x0B }; /* READ ADDRESS DECODING*/ enum RegisterSelect { RSTATUSREG = 0x00, RDATAREG = 0x01, RCNTRLREG = 0x02 }; /* OUTPUT RANGE OPTIONS */ #define _0_5V 0x0000 // Gain 1 #define _0_10V 0x0001 // Gain 2 #define _PLUS_OR_MINUS_5V 0x0010 // Gain 2 #define _PLUS_OR_MINUS_10V 0x0011 // Gain 4 #define _3_AND_HALF_TO_23_AND_HALF 0x0100 #define _0_20mA 0x0101 #define _0_24mA 0x0110 #define _PLUS_OR_MINUS_24mA 0x0111 #define _0_6V 0x1000 // Gain 1.2 #define _0_12V 0x1001 // Gain 2.4 #define _PLUS_OR_MINUS_6V 0x1010 // Gain 2.4 #define _PLUS_OR_MINUS_12V 0x1011 // Gain 4.8 #define _4_20mA 0x1111 /*RESET REGISTER BITS */ const uint8_t RESETBIT = 0x01; /*CONFIGURATION REGISTER BITS */ const uint16_t CLREND = 0x1000; // Channel D Clear enable const uint16_t CLRENC = 0x0800; // Channel C Clear enable const uint16_t CLRENB = 0x0400; // Channel B Clear enable const uint16_t CLRENA = 0x0200; // Channel A Clear enable const uint16_t REF_EN = 0x0010; // Internal REF enable const uint16_t TRN = 0x0008; // Internal REF enable const uint16_t CLR = 0x0004; // Internal REF enable const uint16_t POC = 0x0002; // Internal REF enable const uint16_t UBT = 0x0001; // Internal REF enable /* Private variables ---------------------------------------------------------*/ SPI_HandleTypeDef hspi4; /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MPU_Config(void); static void MX_GPIO_Init(void); static void MX_SPI4_Init(void); void Set_Latch() { HAL_GPIO_WritePin(GPIOE, GPIO_PIN_11, GPIO_PIN_SET); } void Clear_Latch() { HAL_GPIO_WritePin(GPIOE, GPIO_PIN_11, GPIO_PIN_RESET); } void DAC_8775_Write(uint32_t Data) { uint8_t TxBuffer[3]; TxBuffer[0] = (uint8_t)((Data & 0xff0000)>>16); TxBuffer[1] = (uint8_t)((Data & 0x00ff00)>>8); TxBuffer[2] = (uint8_t)((Data & 0x0000ff)>>0); HAL_SPI_Transmit(&hspi4, (uint8_t *)&TxBuffer , 3 , HAL_MAX_DELAY); Set_Latch(); Clear_Latch(); } uint8_t DAC_8775_Check_Comm(uint8_t Data) { uint32_t Comm_data = ((RESETCONFIGREG << 16) | Data); //Toggling user bit here to check communication DAC_8775_Write(Comm_data); // Reading wrote User bit from Status register Comm_data = (((0x80|STATUSREG) << 16)| Data); //Toggling user bit here to check communication // 0x8B0001 DAC_8775_Write(Comm_data); //Doing NOP to read the value from MISO line DAC_8775_Write(0); return 1; // To add the check logic later } void DAC_8775_Init() { Clear_Latch(); uint32_t ResetConfigData, ResetData, DataWrite = 1, BuckBoostData, BuckBoostConfigData, DACreg, DACConfigData; ResetData = ((RSTREG << 16) | 0x01); //0x01, 0x00, 0x01 = 0x010001 // Reseting the chip by setting the reset bit ResetConfigData = ((RESETCONFIGREG << 16) | REF_EN); //0x02, 0x00, 0x10 = 0x020010 // Enabling Volt reference BuckBoostData = ((BUCKBOOSTREG)<<16| 0x0f); //0x06, 0x00, 0x0f = 0x06000f // 0f --> Selecting all the four DAC channels. BuckBoostConfigData = ((BUCKBOOSTCFGREG<<16)|(0x06<<8)|(0x1f)); //0x07, 0x06, 0x1f = 0x07061f // PNSEL --> Buck boost conv + and - enable, PCLAMP & NCLAMP = +15V and -15V, CCLP = USer can write to PCLMP and NCLMP bits DACreg = ((DACREGISTER<<16)|(0x01<<8)|(0xf0)); //0x03, 0x01, 0xf0 = 0x0300f0 // Selecting CHA,CHB,CHC and CHD and disabling Daisy chain mode DACConfigData = ((DACCFGREGISTER<<16)|(0x10<<8)|(0x10)); //0x04, 0x00, 0x01 = 0x041001 // Selecting Voltage range as 0 to +10V, Disabling Slew rate, Setting OUTEN bit //Reset Chip DAC_8775_Write(ResetData); //Check Communication DAC_8775_Check_Comm(DataWrite); //Reset Config data DAC_8775_Write(ResetConfigData); // Enable Buckboost converter all 4 channel DAC_8775_Write(BuckBoostData); // Config voltage supply for Buckboost converters DAC_8775_Write(BuckBoostConfigData); DAC_8775_Write(DACreg); DAC_8775_Write(DACConfigData); } int main(void) { /* MCU Configuration--------------------------------------------------------*/ uint32_t RxData; uint32_t DataReg; uint8_t rec_buffer[3]; /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* MPU Configuration--------------------------------------------------------*/ MPU_Config(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_SPI4_Init(); DAC_8775_Init(); DataReg = (DATAREGISTER<<16|(0xff<<8)|0xff); //Reset Chip DAC_8775_Write(DataReg); RxData = (((0x80|DATAREGISTER)<<16) | 0x00 | 0x00); // 0x85, 0x00, 0x00 = 0x850000 DAC_8775_Write(RxData); while (1) { } } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Supply configuration update enable */ HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY); /** Configure the main internal regulator output voltage */ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3); while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {} /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_DIV1; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2 |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2; RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) { Error_Handler(); } } static void MX_SPI4_Init(void) { /* USER CODE BEGIN SPI4_Init 0 */ /* USER CODE END SPI4_Init 0 */ /* USER CODE BEGIN SPI4_Init 1 */ /* USER CODE END SPI4_Init 1 */ /* SPI4 parameter configuration*/ hspi4.Instance = SPI4; hspi4.Init.Mode = SPI_MODE_MASTER; hspi4.Init.Direction = SPI_DIRECTION_2LINES; hspi4.Init.DataSize = SPI_DATASIZE_8BIT; hspi4.Init.CLKPolarity = SPI_POLARITY_HIGH; hspi4.Init.CLKPhase = SPI_PHASE_1EDGE; hspi4.Init.NSS = SPI_NSS_SOFT; hspi4.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64; hspi4.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi4.Init.TIMode = SPI_TIMODE_DISABLE; hspi4.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi4.Init.CRCPolynomial = 0x0; hspi4.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; hspi4.Init.NSSPolarity = SPI_NSS_POLARITY_LOW; hspi4.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA; hspi4.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN; hspi4.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN; hspi4.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE; hspi4.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE; hspi4.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE; hspi4.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE; hspi4.Init.IOSwap = SPI_IO_SWAP_DISABLE; if (HAL_SPI_Init(&hspi4) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN SPI4_Init 2 */ /* USER CODE END SPI4_Init 2 */ } static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOE_CLK_ENABLE(); /*Configure GPIO pin Output Level */ //HAL_GPIO_WritePin(GPIOE, GPIO_PIN_11, GPIO_PIN_RESET); /*Configure GPIO pin : PE11 */ GPIO_InitStruct.Pin = GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); // PE12 - SPI1 SCLK, PE13 - SPI1 MISO, PE14 - SPI1 MOSI GPIO_InitStruct.Pin = GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 ; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; GPIO_InitStruct.Alternate = GPIO_AF5_SPI4; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); } void MPU_Config(void) { MPU_Region_InitTypeDef MPU_InitStruct = {0}; /* Disables the MPU */ HAL_MPU_Disable(); /** Initializes and configures the Region and the memory to be protected */ MPU_InitStruct.Enable = MPU_REGION_ENABLE; MPU_InitStruct.Number = MPU_REGION_NUMBER0; MPU_InitStruct.BaseAddress = 0x0; MPU_InitStruct.Size = MPU_REGION_SIZE_4GB; MPU_InitStruct.SubRegionDisable = 0x87; MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0; MPU_InitStruct.AccessPermission = MPU_REGION_NO_ACCESS; MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE; MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE; MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE; MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE; HAL_MPU_ConfigRegion(&MPU_InitStruct); /* Enables the MPU */ HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT); } void Error_Handler(void) { /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ __disable_irq(); while (1) { } /* USER CODE END Error_Handler_Debug */ } #ifdef USE_FULL_ASSERT void assert_failed(uint8_t *file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif
EVM 降压增压器是否出现故障? 如果降压升压器出现问题、我们能否恢复 EVM?
我们没有额外的 EVM、我很担心项目截止日期太紧。 我犯的一个错误是我在 RESETCONFIGREGISTER 中启用了内部电压基准、提供了外部电压、并且也安装了 JP11和 JP13。
这会 损坏 DVDD 电源吗? 我可以联系当地的现场应用工程师(SG)寻求帮助吗?
此致、
Naveen
Naveen、
我没有机会浏览您的所有代码、但我只想确认器件仍然处于活动状态并正在进行通信。 您能否返回使用 SM-USB-DIG 和 EVM GUI 查看其是否仍然正常工作? 这可能是最快的检查方法。 您可以检查基准、DVDD 输出/输入和降压/升压的功能。
如果可以的话 、我首先要做一些简单的事情- 比如写入寄存器并读回寄存器以确保通信正确。 之后、我将启用参考并检查以查看是否已打开。
如果您将外部电压连接到内部基准、则 EVM 可能会损坏、但我不确定是否损坏。 我可以尝试了解是否有支持您的 FAE。 我将向您发送消息、并确定后续步骤。
吴约瑟
您好、Joseph、
我没有连接任何外部基准、即 J9的任何电压。 我按照 EVM 用户手册操作、其中提到 使用外部电源电压作为 DVDD 电源、安装跳线 JP13和 JP11并 卸载 JP9。 此外、如果您看到上面附加的图像、右侧 J9未连接、仅 J4已连接、即为 DVDD 供电。
因此、我的连接似乎是正确的、我能够通过 EVM GUI 中的简单 I/O 选项卡读取和写入芯片。 为什么我无法在 VPOS_X、VNEG_X 和基准之间看到适当的电压?
您是否有机会浏览我的代码?
此致、
Naveen
Naveen、
我查看过代码、但我没有看到任何可能是明显问题的东西。 但是、我确实看到在设置 DAC 通道的第108行中、它应该读取0x0301f0而不是0x0300f0。
如果您使用简单的 I/O 与 EVM 进行通信、并且它正在工作、那么我将假定 EVM 也在工作。 我能够发送您的基本初始化序列(从104行开始)并设置器件(并读回数据)。 基准电压都达到5V、而 VPOS_IN 和 VNEG_IN 均设置为±15。 为了测试您的代码、我只想集中精力启动参考。 这是设置可测量的电路板电压的最简单命令。
一个可能有用的方法是使用逻辑分析仪来查看设置基准电压的0x020010命令。 如果简单 I/O 正常工作、请先查看该命令、然后将其与您的命令进行比较。
吴约瑟
Naveen、
我认为 FAE 已经联系过您、但为了确保每个人都在同一页上、请继续在此处发帖。 这样、每个人都可以查看评论。
最近提到的一件事是 CPOL 和 CPHA。 我通常使用 CPOL 作为0、以便 SCLK 保持低电平。 但是,我认为,CPOL 为1仍然有效。 重要的是、数据在 SCLK 的下降沿计时、因此在这种情况下、CPHA 为1。 您能否验证您的代码中是否存在这种情况? 获取通信的示波器截图以验证通信的时间和构造将非常有帮助。
我不确定的另一件事是 DVDD。 在之前的帖子中、DVDD 是外部的、对于该外部、您禁用了 DVDD LDO、并启用了外部 DVDD (通过安装 J11和 J13)。 无论您使用的是内部还是外部 DVDD、DVDD 和微控制器电源都应相同。 如果 DVDD 为5V、微控制器以3V 电压运行、微控制器的输出将永远不会足够高、无法设置逻辑高电压。
我仍然认为、您需要从启用基准的简单命令开始、只需验证通信即可。 在您获取有关示波器的截图后、将数字通信发布回此主题。
吴约瑟
您好、Joseph、
我在 AVDD 和 GND 之间连接了+15V 电压、断开了 USB-DIG、断开了 JP9、J11和 JP13、并在 TP 上连接了 SPI (启用的内部 DVDD LDO)。 我刷写了简单代码以在通道1上设置 FFFF、MISO 线路中没有数据、当我在 TP17和 GND 上测量时、TP20和 GND 之间的电压为0v (基准电压)、类似地、电压为0v。 这 是在旧板上看到的。
/** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * Copyright (c) 2022 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** #include "main.h" #include <stdio.h> #include <string.h> /*ADDRESS BYTE FUNCTIONS */ /*const uint8_t AD_NOP = 0x00; const uint8_t DATA_REGISTER = 0x01; const uint8_t READBACK = 0x02; const uint8_t CNTRLREG = 0x55; const uint8_t RSTREG = 0x56; */ enum Operation { AD_NOP = 0x00, DATA_REGISTER = 0x01, READBACK = 0x02, CNTRLREG = 0x55, RSTREG = 0x56 }; /* READ ADDRESS DECODING*/ enum RegisterSelect { RSTATUSREG = 0x00, RDATAREG = 0x01, RCNTRLREG = 0x02 }; /* const uint8_t RSTATUSREG = 0x00; const uint8_t RDATAREG = 0x01; const uint8_t RCNTRLREG = 0x02; */ /* OUTPUT RANGE OPTIONS */ #define _0_5V 0x00 #define _0_10V 0x01 #define _4_20mA 0x05 #define _0_20mA 0x06 #define _0_24mA 0x07 /*RESET REGISTER BITS */ const uint8_t RESETBIT = 0x01; /*CONFIGURATION REGISTER BITS */ const uint8_t RESETREGISTER = 0x00; // Register operation to be added separately const uint8_t SLEWRATE_EN = 0x10; const uint8_t SR_STEP1_16 = 0x00; //0 const uint8_t SR_STEP1_8 = 0x20; //1 const uint8_t SR_STEP1_4 = 0x40; //2 const uint8_t SR_STEP1_2 = 0x60; //3 const uint8_t SR_STEP1_1 = 0x80; //4 const uint8_t SR_STEP_2 = 0xA0; //5 const uint8_t SR_STEP_4 = 0xC0; //6 const uint8_t SR_STEP_8 = 0xE0; //7 const uint16_t OUTEN = 0x2000; const uint16_t REXT = 0x1000; void SystemClock_Config(void); static void MPU_Config(void); static void MX_GPIO_Init(void); static void MX_SPI4_Init(void); static void DAC8775_Init(void); void Set_Latch() { HAL_GPIO_WritePin(GPIOE, GPIO_PIN_11, GPIO_PIN_SET); } void Clear_Latch() { HAL_GPIO_WritePin(GPIOE, GPIO_PIN_11, GPIO_PIN_RESET); } /** * @brief The application entry point. * @retval int */ int main(void) { /* MCU Configuration--------------------------------------------------------*/ uint32_t DAC_Reg_Write = 0x05ffff; uint8_t TxBuf[3]; /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* MPU Configuration--------------------------------------------------------*/ MPU_Config(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_SPI4_Init(); DAC8775_Init(); TxBuf[0] = (uint8_t)((DAC_Reg_Write & 0xff0000)>>16); TxBuf[1] = (uint8_t)((DAC_Reg_Write & 0x00ff00)>>8); TxBuf[2] = (uint8_t)((DAC_Reg_Write & 0x0000ff)>>0); HAL_SPI_Transmit(&hspi4, (uint8_t *)&TxBuf , 3 , HAL_MAX_DELAY); // Transmitting Configured Buffer value to AD5422 Set_Latch(); Clear_Latch(); while (1) { } } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Supply configuration update enable */ HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY); /** Configure the main internal regulator output voltage */ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3); while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {} /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_DIV1; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2 |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2; RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) { Error_Handler(); } } static void DAC8775_Init(void) { Set_Latch(); Clear_Latch(); uint32_t Reset = 0x010001; uint32_t Enable_BuckBoost = 0x060001; uint32_t Config_BuckBoost = 0x07001f; // 0x0700001 -- 1f -> Default settings, 01 only pos clamp enabled uint32_t Enable_ref = 0x020010; uint32_t Select_DAC = 0x030030; uint32_t Config_DAC = 0x041001; int32_t Readvalue = 0; uint8_t Rxbuffer[3] = {0, 0, 0}; uint8_t TxBuf[3]; TxBuf[0] = (uint8_t)((Reset & 0xff0000)>>16); TxBuf[1] = (uint8_t)((Reset & 0x00ff00)>>8); TxBuf[2] = (uint8_t)((Reset & 0x0000ff)>>0); HAL_SPI_Transmit(&hspi4, (uint8_t *)&TxBuf , 3 , HAL_MAX_DELAY); Set_Latch(); Clear_Latch(); //HAL_Delay(500); memset(TxBuf,0,sizeof(TxBuf)); TxBuf[0] = (uint8_t)((Enable_BuckBoost & 0xff0000)>>16); TxBuf[1] = (uint8_t)((Enable_BuckBoost & 0x00ff00)>>8); TxBuf[2] = (uint8_t)((Enable_BuckBoost & 0x0000ff)>>0); HAL_SPI_Transmit(&hspi4, (uint8_t *)&TxBuf , 3 , HAL_MAX_DELAY); Set_Latch(); Clear_Latch(); //HAL_Delay(500); memset(TxBuf,0,sizeof(TxBuf)); TxBuf[0] = (uint8_t)((Config_BuckBoost & 0xff0000)>>16); TxBuf[1] = (uint8_t)((Config_BuckBoost & 0x00ff00)>>8); TxBuf[2] = (uint8_t)((Config_BuckBoost & 0x0000ff)>>0); HAL_SPI_Transmit(&hspi4, (uint8_t *)&TxBuf , 3 , HAL_MAX_DELAY); Set_Latch(); Clear_Latch(); //HAL_Delay(500); memset(TxBuf,0,sizeof(TxBuf)); TxBuf[0] = (uint8_t)((Enable_ref & 0xff0000)>>16); TxBuf[1] = (uint8_t)((Enable_ref & 0x00ff00)>>8); TxBuf[2] = (uint8_t)((Enable_ref & 0x0000ff)>>0); HAL_SPI_Transmit(&hspi4, (uint8_t *)&TxBuf , 3 , HAL_MAX_DELAY); Set_Latch(); Clear_Latch(); uint32_t Data = 0x820000; TxBuf[0] = (uint8_t)((Data & 0xff0000)>>16); TxBuf[1] = (uint8_t)((Data & 0x00ff00)>>8); TxBuf[2] = (uint8_t)((Data & 0x0000ff)>>0); HAL_SPI_Transmit(&hspi4, (uint8_t *)&TxBuf , 3 , HAL_MAX_DELAY); Set_Latch(); Clear_Latch(); TxBuf[0] = (uint8_t)((0x000000 & 0xff0000)>>16); TxBuf[1] = (uint8_t)((0x000000 & 0x00ff00)>>8); TxBuf[2] = (uint8_t)((0x000000 & 0x0000ff)>>0); HAL_SPI_TransmitReceive(&hspi4, (uint8_t *)&TxBuf , (uint8_t *)&Rxbuffer, 3 , HAL_MAX_DELAY); Set_Latch(); Clear_Latch(); Readvalue |= (int32_t) (Rxbuffer[1] << 8); Readvalue |= (int32_t) (Rxbuffer[2] << 0); //HAL_Delay(500); memset(TxBuf,0,sizeof(TxBuf)); TxBuf[0] = (uint8_t)((Select_DAC & 0xff0000)>>16); TxBuf[1] = (uint8_t)((Select_DAC & 0x00ff00)>>8); TxBuf[2] = (uint8_t)((Select_DAC & 0x0000ff)>>0); HAL_SPI_Transmit(&hspi4, (uint8_t *)&TxBuf , 3 , HAL_MAX_DELAY); Set_Latch(); Clear_Latch(); //HAL_Delay(500); memset(TxBuf,0,sizeof(TxBuf)); TxBuf[0] = (uint8_t)((Config_DAC & 0xff0000)>>16); TxBuf[1] = (uint8_t)((Config_DAC & 0x00ff00)>>8); TxBuf[2] = (uint8_t)((Config_DAC & 0x0000ff)>>0); HAL_SPI_Transmit(&hspi4, (uint8_t *)&TxBuf , 3 , HAL_MAX_DELAY); Set_Latch(); Clear_Latch(); } /** * @brief SPI4 Initialization Function * @param None * @retval None */ static void MX_SPI4_Init(void) { /* SPI4 parameter configuration*/ hspi4.Instance = SPI4; hspi4.Init.Mode = SPI_MODE_MASTER; hspi4.Init.Direction = SPI_DIRECTION_2LINES; hspi4.Init.DataSize = SPI_DATASIZE_8BIT; hspi4.Init.CLKPolarity = SPI_POLARITY_HIGH; // Clock Idle State High hspi4.Init.CLKPhase = SPI_PHASE_1EDGE; // FALLING EDGE hspi4.Init.NSS = SPI_NSS_SOFT; hspi4.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64; hspi4.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi4.Init.TIMode = SPI_TIMODE_DISABLE; hspi4.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi4.Init.CRCPolynomial = 0x0; hspi4.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; hspi4.Init.NSSPolarity = SPI_NSS_POLARITY_LOW; hspi4.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA; hspi4.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN; hspi4.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN; hspi4.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE; hspi4.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE; hspi4.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE; hspi4.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE; hspi4.Init.IOSwap = SPI_IO_SWAP_DISABLE; if (HAL_SPI_Init(&hspi4) != HAL_OK) { } } /** * @brief GPIO Initialization Function * @param None * @retval None */ static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOE_CLK_ENABLE(); /*Configure GPIO pin Output Level */ //HAL_GPIO_WritePin(GPIOE, GPIO_PIN_11, GPIO_PIN_RESET); /*Configure GPIO pin : PE11 */ GPIO_InitStruct.Pin = GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); // PE12 - SPI1 SCLK, PE13 - SPI1 MISO, PE14 - SPI1 MOSI GPIO_InitStruct.Pin = GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 ; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; GPIO_InitStruct.Alternate = GPIO_AF5_SPI4; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); } /* MPU Configuration */ void MPU_Config(void) { MPU_Region_InitTypeDef MPU_InitStruct = {0}; /* Disables the MPU */ HAL_MPU_Disable(); /** Initializes and configures the Region and the memory to be protected */ MPU_InitStruct.Enable = MPU_REGION_ENABLE; MPU_InitStruct.Number = MPU_REGION_NUMBER0; MPU_InitStruct.BaseAddress = 0x0; MPU_InitStruct.Size = MPU_REGION_SIZE_4GB; MPU_InitStruct.SubRegionDisable = 0x87; MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0; MPU_InitStruct.AccessPermission = MPU_REGION_NO_ACCESS; MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE; MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE; MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE; MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE; HAL_MPU_ConfigRegion(&MPU_InitStruct); /* Enables the MPU */ HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT); } /** * @brief This function is executed in case of error occurrence. * @retval None */ void Error_Handler(void) { /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ __disable_irq(); while (1) { } /* USER CODE END Error_Handler_Debug */ } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */ void assert_failed(uint8_t *file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */
请查找 SPI 捕获。
我还尝试将 EVM 连接到 GUI 工具。 复位、使能内部基准、使能降压升压转换器、使能输出并将值作为 FFFF 写入 DAC 数据寄存器。 我能够将写入的值读回为 FFFF。
但输出电压为0。 然后、我读取复位配置寄存器0x02的状态、它是0x10 -因此启用参考
然后、我读取状态寄存器0x0B -它是0x1400 -因此、仅降压/升压转换器 D 就处于良好状态。
那么、简单 I/O 正常工作为什么我在连接到 TP 时无法通过 SPI 读回相同的内容、为什么输出未正确显示?
Naveen、
我认为您的连接正确。 15V 电源从 PVDD/AVDD 通过 J2接地。 移除了 JP9、断开 SM-USB-DIG 电源与 DVDD 的连接;安装的 JP11禁用 DVDD LDO 输出;安装的 JP13选择外部 DVDD。 请注意、EVM 用户指南中的表3包含跳线标签和功能、以防万一。 此外、您还可以使用 EVM 左上角的测试引脚连接 SPI 引脚。 DVDD 电源可连接到 J4。 只需确保您使用的 DVDD 电压与微控制器相同。
如果简单 I/O 正常工作、那么也应使用外部微控制器。 SM-USB-DIG 实际上只是连接一个外部微控制器。
我认为这要么是微控制器 SPI 设置问题、器件无法获得正确的 SPI 版本、要么是连接问题、要么是 SPI 未接收到、要么电路板设置不正确。
对于您发送的逻辑分析仪快照、您能否发送每个传输的图片? 细节太小、无法查看各个命令。 为每个命令发送图片。 如果此逻辑分析仪是 Saleae、则可以发送分析仪文件。 我有用于读取该数据的软件。
您能否发送电路板图片以及电路板设置方式? 这可能有助于通过标签显示您已连接所有设备的位置。
吴约瑟
Naveen、
在本例中、您将移除 JP11和 JP13。 在这种情况下、DVDD_EN 保持悬空、这应启用内部 DVDD、而不应使用外部 DVDD。 从图片上看、我没有看到任何与 DVDD 线路的外部连接、这看起来是正确的。 由于 DVDD 已启用、因此您应该能够测量 DVDD 线路、我希望该线路接近5V。
我在前一篇文章中问过这一点、但微控制器的运行电压是多少? 如果微控制器以3V 电压运行、则 DAC 可能不会以高电压的形式接收逻辑高电平。
最后、也可能是最重要的一点、我查看了您从逻辑分析仪发出的命令。 25个 SCLK 的每个命令。 命令的正确形式是帧为24个 SCLK。 使用额外的 SCLK、我认为器件没有读取任何正确的命令。 纠正此问题并查看器件是否响应。
吴约瑟
在本例中、您将移除 JP11和 JP13。 在这种情况下、DVDD_EN 保持悬空、这应启用内部 DVDD、而不应使用外部 DVDD。 从图片上看、我没有看到任何与 DVDD 线路的外部连接、这看起来是正确的。 由于 DVDD 已启用,因此您应该能够测量 DVDD 线路,我希望它接近5V --是的,我没有连接外部 DVDD 电源,我无法在 DVDD TP 中看到5V
我在前一篇文章中问过这一点、但微控制器的运行电压是多少? - 5V
最后、也可能是最重要的一点、我查看了您从逻辑分析仪发出的命令。 25个 SCLK 的每个命令。 命令的正确形式是帧为24个 SCLK。 这是逻辑分析仪上的毛刺脉冲、SCLK 为24。 第一部分是逻辑分析仪的毛刺脉冲
Naveen、
首先、当我为电路板加电时、电源在启动时拉取大约3-4 mA (无需初始化任何内容)。 如果我拔出 J11上的跳线、我可以立即看到 DVDD 电源出现(我的 DMM 上的读数为5.1V)。 如果我将跳线放回、则 DVDD 电源返回0V。 您能再检查一下吗? 可能首先断开除电源之外的所有器件。
我看到您为 STLINK-V3E 放置的图像、我得到 USB 连接为5V、但我需要确保微控制器也以5V 运行。 极有可能有一些 LDO 用于设置微控制器的电源。 在介绍该板的 STM 页面上、它显示多路径桥接 USB 转 SPI 支持3V 至3.6V 应用、因此我不确定微控制器本身是否真正以5V 运行。 您可以做的一件事是设置 Saleae 以测量所有这些数字信号的模拟电压。 这样您就可以验证传输和通信的电压。 同样、如果您将此 Saleae 文件保存到帖子中、我将能够阅读它。
此外、通过将 Saleae 设置为同时读取模拟电压、您可以验证 Saleae 上没有真正的毛刺脉冲、并且微控制器仅发送24个 SCLK。 您如何知道这是逻辑分析仪的毛刺脉冲、而不是真正的额外 SCLK 脉冲?
吴约瑟
您好、Joseph、
您如何知道这是逻辑分析仪的毛刺脉冲、而不是真正的额外 SCLK 脉冲? -抱歉、它不是干扰、现在我删除了一些额外的代码、数据已正确发送。
我尝试在新的评估板中使用 SPI 启用 DAC8775EVM 的内部基准。 我向 DAC8775EVM 发送了数据并进行回读、但内部基准位未启用。 请查找 DAC 捕获。
此外、微控制器以3.6V 的电压运行。 USB 的5V 电压馈入 LDO 稳压器、LDO 为 STM32提供3.3V 电压。 我将附上有关 LDO 的信息。
那么、在本例中、如何使 DAC8775EVM 正常工作? 请帮我解决、因为我长时间滞留在这里。
此致、
Naveen
Naveen、
如果微控制器信号为3.3且 DAC DVDD 为5V、则信号可能不会达到足够高的水平以达到数字电压高。 在这种情况下、您将禁用 DVDD LDO (通过插入 JP11禁用 DVDD LDO)、然后将3.3V 从微控制器连接到 DVDD。 这与 DAC 和微控制器的数字电压和电平相匹配。
请注意、我测试了启用基准。 SPI SCLK 空闲、并且在下降沿随时钟移入(和移出)。 对于示波器照片:
黄色:/CS
蓝色:DIN
粉色:SCLK
绿色:DOUT
这是启用基准的写入。
这是对寄存器的回读。
这确实启用了基准、我可以在写入基准使能后看到5V 输出。
吴约瑟
您好、Joseph、
这次我使用了+3.3V 微控制器的 DVDD (连接到外部端口 J4,插入跳线 J11和 J13)为 DAC8775EVM 加电。 我尝试了回读序列。 我无法正确回读该值。 我附上代码并在这里进行捕获。
能不能在这里帮我快速解决问题、我已经在这里停留了这么长时间了。 我甚至无法建立通信并打开参考。
/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * Copyright (c) 2023 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" #include <string.h> /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ SPI_HandleTypeDef hspi4; /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MPU_Config(void); static void MX_GPIO_Init(void); static void MX_SPI4_Init(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ void Set_Latch() { HAL_GPIO_WritePin(GPIOE, GPIO_PIN_11, GPIO_PIN_SET); } void Clear_Latch() { HAL_GPIO_WritePin(GPIOE, GPIO_PIN_11, GPIO_PIN_RESET); } static void DAC8775_Init(void) { uint32_t Reset = 0x010001; //uint32_t Enable_BuckBoost = 0x060001; //uint32_t Config_BuckBoost = 0x07001f; // 0x0700001 -- 1f -> Default settings, 01 only pos clamp enabled uint32_t Enable_ref = 0x020010; //uint32_t Select_DAC = 0x030030; //uint32_t Config_DAC = 0x041001; int32_t Readvalue = 0; uint8_t Rxbuffer[3] = {0, 0, 0}; uint8_t TxBuf[3]; TxBuf[0] = 0x01;//(uint8_t)((Reset & 0xff0000)>>16); TxBuf[1] = 0x00;//(uint8_t)((Reset & 0x00ff00)>>8); TxBuf[2] = 0x01;//(uint8_t)((Reset & 0x0000ff)>>0); HAL_SPI_Transmit(&hspi4, (uint8_t *)&TxBuf , 3 , HAL_MAX_DELAY); Set_Latch(); Clear_Latch(); memset(TxBuf,0,sizeof(TxBuf)); TxBuf[0] = 0x02;//(uint8_t)((Enable_ref & 0xff0000)>>16); TxBuf[1] = 0x00;//(uint8_t)((Enable_ref & 0x00ff00)>>8); TxBuf[2] = 0x10;//(uint8_t)((Enable_ref & 0x0000ff)>>0); HAL_SPI_Transmit(&hspi4, (uint8_t *)&TxBuf , 3 , HAL_MAX_DELAY); Set_Latch(); Clear_Latch(); uint32_t Data = 0x820000; TxBuf[0] = 0x82;//(uint8_t)((Data & 0xff0000)>>16); TxBuf[1] = 0x00;//(uint8_t)((Data & 0x00ff00)>>8); TxBuf[2] = 0x00;//(uint8_t)((Data & 0x0000ff)>>0); HAL_SPI_Transmit(&hspi4, (uint8_t *)&TxBuf , 3 , HAL_MAX_DELAY); Set_Latch(); Clear_Latch(); TxBuf[0] = 0x00;//(uint8_t)((0x000000 & 0xff0000)>>16); TxBuf[1] = 0x00;//(uint8_t)((0x000000 & 0x00ff00)>>8); TxBuf[2] = 0x00;//(uint8_t)((0x000000 & 0x0000ff)>>0); HAL_SPI_TransmitReceive(&hspi4, (uint8_t *)&TxBuf , (uint8_t *)&Rxbuffer, 3 , HAL_MAX_DELAY); Set_Latch(); Clear_Latch(); Readvalue |= (int32_t) (Rxbuffer[0] << 16); Readvalue |= (int32_t) (Rxbuffer[1] << 8); Readvalue |= (int32_t) (Rxbuffer[2] << 0); } /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MPU Configuration--------------------------------------------------------*/ MPU_Config(); /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_SPI4_Init(); DAC8775_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Supply configuration update enable */ HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY); /** Configure the main internal regulator output voltage */ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3); while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {} /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_DIV1; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2 |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2; RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) { Error_Handler(); } } /** * @brief SPI4 Initialization Function * @param None * @retval None */ static void MX_SPI4_Init(void) { /* USER CODE BEGIN SPI4_Init 0 */ /* USER CODE END SPI4_Init 0 */ /* USER CODE BEGIN SPI4_Init 1 */ /* USER CODE END SPI4_Init 1 */ /* SPI4 parameter configuration*/ hspi4.Instance = SPI4; hspi4.Init.Mode = SPI_MODE_MASTER; hspi4.Init.Direction = SPI_DIRECTION_2LINES; hspi4.Init.DataSize = SPI_DATASIZE_8BIT; hspi4.Init.CLKPolarity = SPI_POLARITY_LOW; hspi4.Init.CLKPhase = SPI_PHASE_1EDGE; hspi4.Init.NSS = SPI_NSS_SOFT; hspi4.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64; hspi4.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi4.Init.TIMode = SPI_TIMODE_DISABLE; hspi4.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi4.Init.CRCPolynomial = 0x0; hspi4.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; hspi4.Init.NSSPolarity = SPI_NSS_POLARITY_LOW; hspi4.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA; hspi4.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN; hspi4.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN; hspi4.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE; hspi4.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE; hspi4.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE; hspi4.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE; hspi4.Init.IOSwap = SPI_IO_SWAP_DISABLE; if (HAL_SPI_Init(&hspi4) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN SPI4_Init 2 */ /* USER CODE END SPI4_Init 2 */ } /** * @brief GPIO Initialization Function * @param None * @retval None */ static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOE_CLK_ENABLE(); /*Configure GPIO pin : PE11 */ GPIO_InitStruct.Pin = GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); // PE12 - SPI1 SCLK, PE13 - SPI1 MISO, PE14 - SPI1 MOSI GPIO_InitStruct.Pin = GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 ; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; GPIO_InitStruct.Alternate = GPIO_AF5_SPI4; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); } /* USER CODE BEGIN 4 */ /* USER CODE END 4 */ /* MPU Configuration */ void MPU_Config(void) { MPU_Region_InitTypeDef MPU_InitStruct = {0}; /* Disables the MPU */ HAL_MPU_Disable(); /** Initializes and configures the Region and the memory to be protected */ MPU_InitStruct.Enable = MPU_REGION_ENABLE; MPU_InitStruct.Number = MPU_REGION_NUMBER0; MPU_InitStruct.BaseAddress = 0x0; MPU_InitStruct.Size = MPU_REGION_SIZE_4GB; MPU_InitStruct.SubRegionDisable = 0x87; MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0; MPU_InitStruct.AccessPermission = MPU_REGION_NO_ACCESS; MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE; MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE; MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE; MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE; HAL_MPU_ConfigRegion(&MPU_InitStruct); /* Enables the MPU */ HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT); } /** * @brief This function is executed in case of error occurrence. * @retval None */ void Error_Handler(void) { /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ __disable_irq(); while (1) { } /* USER CODE END Error_Handler_Debug */ } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval None */ void assert_failed(uint8_t *file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */
谢谢、此致、
Naveen
Naveen、
从逻辑分析仪图片中可以看到、SPI 设置不正确。 DIN 应在 SCLK 的上升沿发生变化、并在器件读取 SCLK 的下降沿期间保持稳定。 在拍摄中、动作相反、数据在 SCLK 的下降沿发生变化、并在 SCLK 的上升沿期间保持稳定。 在这个时序中、数据将不正确(并且可能看起来像被一个位移位)。
看起来 SDO 正在计时数据。 正确设置 SPI 后、我希望您能够读取器件并向器件写入数据。
吴约瑟