国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

STM32模擬SPI時(shí)序控制雙路16位數(shù)模轉(zhuǎn)換(16bit DAC)芯片DAC8552電壓輸出

這篇具有很好參考價(jià)值的文章主要介紹了STM32模擬SPI時(shí)序控制雙路16位數(shù)模轉(zhuǎn)換(16bit DAC)芯片DAC8552電壓輸出。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

STM32模擬SPI時(shí)序控制雙路16位數(shù)模轉(zhuǎn)換(16bit DAC)芯片DAC8552電壓輸出

STM32部分芯片具有12位DAC輸出能力,要實(shí)現(xiàn)16位及以上DAC輸出需要外掛DAC轉(zhuǎn)換ASIC。

DAC8552是雙路16位DAC輸出芯片,通過SPI三線總線進(jìn)行配置控制輸出。這里介紹通過GPIO管腳模擬時(shí)序進(jìn)行控制的方式。

電路連接

DAC8552支持2.7V~5.5V的供電,根據(jù)需要提供電源電壓,對(duì)于STM32可能面對(duì)不同供電電壓的DAC8552, 因此STM32與DAC8552連接的三線,可以用10K電阻上拉到DAC8552的供電電壓,而STM32選擇支持FT(5V耐壓)的三個(gè)管腳,并采用Open-drain無上下拉輸出模式,從而可以兼容在各種供電條件下的DAC8552訪問控制。對(duì)于STM32F103可以采用PB6, PB7和PB8進(jìn)行連接,對(duì)于5V供電的DAC8552的連接如下圖所示:

STM32模擬SPI時(shí)序控制雙路16位數(shù)模轉(zhuǎn)換(16bit DAC)芯片DAC8552電壓輸出

DAC8552控制協(xié)議

STM32通過發(fā)送24個(gè)位的SPI數(shù)據(jù)控制DAC8552的工作狀態(tài)。其中前16個(gè)位為單路(通道A或通道B)的DAC配置值,后8個(gè)位為控制指令。
STM32模擬SPI時(shí)序控制雙路16位數(shù)模轉(zhuǎn)換(16bit DAC)芯片DAC8552電壓輸出
協(xié)議控制操作主要由兩部分操作構(gòu)成:

  1. 發(fā)送24位數(shù)據(jù)到某個(gè)通道的buffer
  2. 執(zhí)行buffer里24位數(shù)據(jù)里的控制指令,即"load"某個(gè)通道,指令可能是通道關(guān)電,也可能是DAC電壓根據(jù)配置數(shù)據(jù)值輸出

在關(guān)電模式可以配置通道管腳處于1K下拉,100K下拉或高阻狀態(tài)。操作方式比較多,如下圖所示:
STM32模擬SPI時(shí)序控制雙路16位數(shù)模轉(zhuǎn)換(16bit DAC)芯片DAC8552電壓輸出
STM32模擬SPI時(shí)序控制雙路16位數(shù)模轉(zhuǎn)換(16bit DAC)芯片DAC8552電壓輸出
可以進(jìn)行簡(jiǎn)化,對(duì)于通道配置只采用這幾種指令:
STM32模擬SPI時(shí)序控制雙路16位數(shù)模轉(zhuǎn)換(16bit DAC)芯片DAC8552電壓輸出
對(duì)于通告關(guān)電只采用這幾種:
STM32模擬SPI時(shí)序控制雙路16位數(shù)模轉(zhuǎn)換(16bit DAC)芯片DAC8552電壓輸出

STM32CUBEIDE工程配置

這里采用STM32CUBEIDE,對(duì)STM32F103C6T6芯片進(jìn)行HAL庫工程配置。
首先配置時(shí)鐘系統(tǒng):
STM32模擬SPI時(shí)序控制雙路16位數(shù)模轉(zhuǎn)換(16bit DAC)芯片DAC8552電壓輸出
STM32模擬SPI時(shí)序控制雙路16位數(shù)模轉(zhuǎn)換(16bit DAC)芯片DAC8552電壓輸出
STM32模擬SPI時(shí)序控制雙路16位數(shù)模轉(zhuǎn)換(16bit DAC)芯片DAC8552電壓輸出
然后配置三線的管腳:
STM32模擬SPI時(shí)序控制雙路16位數(shù)模轉(zhuǎn)換(16bit DAC)芯片DAC8552電壓輸出
保存并生成基本:
STM32模擬SPI時(shí)序控制雙路16位數(shù)模轉(zhuǎn)換(16bit DAC)芯片DAC8552電壓輸出

STM32工程代碼

SPI三線只向DAC8552單向發(fā)送數(shù)據(jù)進(jìn)行控制。在SYNC即片選低電平期間,每個(gè)SCLK時(shí)鐘下降沿DAC8552采樣輸入數(shù)據(jù)。

這里采用的微秒級(jí)延時(shí)函數(shù),參考 STM32 HAL us delay(微秒延時(shí))的指令延時(shí)實(shí)現(xiàn)方式及優(yōu)化 。

首先定義管腳輸出態(tài):

#define   DAC8552_SYNC_LOW    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);
#define   DAC8552_SYNC_HIGH   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
#define   DAC8552_DIN_LOW     HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
#define   DAC8552_DIN_HIGH    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);
#define   DAC8552_SCLK_LOW    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
#define   DAC8552_SCLK_HIGH   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);

然后編寫通道輸出配置函數(shù), 這里提供單通道和雙通道配置的函數(shù),以及單通道和雙通道關(guān)電的函數(shù):

void DAC8552_Set_Channel_A(uint16_t Data)
{
	uint8_t CMD = 0;
	uint32_t WriteData = 0;

	__disable_irq() ; //disable all interrupts

    CMD = 0x10;
	WriteData = (CMD<<16) | Data;

	DAC8552_SYNC_HIGH;
	PY_Delay_us_t(1);
	DAC8552_SYNC_LOW;

	for(uint8_t i=0;i<24;i++)
	{
		if( (WriteData << i) & 0x800000 )
		{
			DAC8552_DIN_HIGH;
		}
		else
		{
			DAC8552_DIN_LOW;
		}

		DAC8552_SCLK_HIGH;
		PY_Delay_us_t(1);
		DAC8552_SCLK_LOW;
		PY_Delay_us_t(1);
	}

	DAC8552_SYNC_HIGH;

    __enable_irq() ;  //enable all interrupts
}

void DAC8552_Set_Channel_B(uint16_t Data)
{
	uint8_t CMD = 0;
	uint32_t WriteData = 0;

	__disable_irq() ; //disable all interrupts

    CMD = 0x24;
	WriteData = (CMD<<16) | Data;

	DAC8552_SYNC_HIGH;
	PY_Delay_us_t(1);
	DAC8552_SYNC_LOW;

	for(uint8_t i=0;i<24;i++)
	{
		if( (WriteData << i) & 0x800000 )
		{
			DAC8552_DIN_HIGH;
		}
		else
		{
			DAC8552_DIN_LOW;
		}

		DAC8552_SCLK_HIGH;
		PY_Delay_us_t(1);
		DAC8552_SCLK_LOW;
		PY_Delay_us_t(1);
	}

	DAC8552_SYNC_HIGH;

    __enable_irq() ;  //enable all interrupts
}


void DAC8552_Set_Channel_AB(uint16_t Data)
{
	uint8_t CMD = 0;
	uint32_t WriteData = 0;

	__disable_irq() ; //disable all interrupts

    CMD = 0x10;
	WriteData = (CMD<<16) | Data;

	DAC8552_SYNC_HIGH;
	PY_Delay_us_t(1);
	DAC8552_SYNC_LOW;

	for(uint8_t i=0;i<24;i++)
	{
		if( (WriteData << i) & 0x800000 )
		{
			DAC8552_DIN_HIGH;
		}
		else
		{
			DAC8552_DIN_LOW;
		}

		DAC8552_SCLK_HIGH;
		PY_Delay_us_t(1);
		DAC8552_SCLK_LOW;
		PY_Delay_us_t(1);
	}

	DAC8552_SYNC_HIGH;


    CMD = 0x24;
	WriteData = (CMD<<16) | Data;

	DAC8552_SYNC_HIGH;
	PY_Delay_us_t(1);
	DAC8552_SYNC_LOW;

	for(uint8_t i=0;i<24;i++)
	{
		if( (WriteData << i) & 0x800000 )
		{
			DAC8552_DIN_HIGH;
		}
		else
		{
			DAC8552_DIN_LOW;
		}

		DAC8552_SCLK_HIGH;
		PY_Delay_us_t(1);
		DAC8552_SCLK_LOW;
		PY_Delay_us_t(1);
	}

	DAC8552_SYNC_HIGH;

    __enable_irq() ;  //enable all interrupts
}

void DAC8552_Set_PowerDown_1K_A(void)
{

	uint8_t CMD = 0;
	uint32_t WriteData = 0;

	__disable_irq() ; //disable all interrupts

    CMD = 0x11;
    WriteData = (CMD<<16);

	DAC8552_SYNC_HIGH;
	PY_Delay_us_t(1);
	DAC8552_SYNC_LOW;

	for(uint8_t i=0;i<24;i++)
	{
		if( (WriteData << i) & 0x800000 )
		{
			DAC8552_DIN_HIGH;
		}
		else
		{
			DAC8552_DIN_LOW;
		}

		DAC8552_SCLK_HIGH;
		PY_Delay_us_t(1);
		DAC8552_SCLK_LOW;
		PY_Delay_us_t(1);
	}

	DAC8552_SYNC_HIGH;

    __enable_irq() ;  //enable all interrupts

}

void DAC8552_Set_PowerDown_1K_B(void)
{

	uint8_t CMD = 0;
	uint32_t WriteData = 0;

	__disable_irq() ; //disable all interrupts

    CMD = 0x25;
    WriteData = (CMD<<16);

	DAC8552_SYNC_HIGH;
	PY_Delay_us_t(1);
	DAC8552_SYNC_LOW;

	for(uint8_t i=0;i<24;i++)
	{
		if( (WriteData << i) & 0x800000 )
		{
			DAC8552_DIN_HIGH;
		}
		else
		{
			DAC8552_DIN_LOW;
		}

		DAC8552_SCLK_HIGH;
		PY_Delay_us_t(1);
		DAC8552_SCLK_LOW;
		PY_Delay_us_t(1);
	}

	DAC8552_SYNC_HIGH;

    __enable_irq() ;  //enable all interrupts

}

void DAC8552_Set_PowerDown_1K_AB(void)
{

	uint8_t CMD = 0;
	uint32_t WriteData = 0;

	__disable_irq() ; //disable all interrupts

    CMD = 0x11;
    WriteData = (CMD<<16);

	DAC8552_SYNC_HIGH;
	PY_Delay_us_t(1);
	DAC8552_SYNC_LOW;

	for(uint8_t i=0;i<24;i++)
	{
		if( (WriteData << i) & 0x800000 )
		{
			DAC8552_DIN_HIGH;
		}
		else
		{
			DAC8552_DIN_LOW;
		}

		DAC8552_SCLK_HIGH;
		PY_Delay_us_t(1);
		DAC8552_SCLK_LOW;
		PY_Delay_us_t(1);
	}

	DAC8552_SYNC_HIGH;


    CMD = 0x25;
    WriteData = (CMD<<16);

	DAC8552_SYNC_HIGH;
	PY_Delay_us_t(1);
	DAC8552_SYNC_LOW;

	for(uint8_t i=0;i<24;i++)
	{
		if( (WriteData << i) & 0x800000 )
		{
			DAC8552_DIN_HIGH;
		}
		else
		{
			DAC8552_DIN_LOW;
		}

		DAC8552_SCLK_HIGH;
		PY_Delay_us_t(1);
		DAC8552_SCLK_LOW;
		PY_Delay_us_t(1);
	}

	DAC8552_SYNC_HIGH;

    __enable_irq() ;  //enable all interrupts

}


void DAC8552_Set_PowerDown_100K_A(void)
{

	uint8_t CMD = 0;
	uint32_t WriteData = 0;

	__disable_irq() ; //disable all interrupts

    CMD = 0x12;
    WriteData = (CMD<<16);

	DAC8552_SYNC_HIGH;
	PY_Delay_us_t(1);
	DAC8552_SYNC_LOW;

	for(uint8_t i=0;i<24;i++)
	{
		if( (WriteData << i) & 0x800000 )
		{
			DAC8552_DIN_HIGH;
		}
		else
		{
			DAC8552_DIN_LOW;
		}

		DAC8552_SCLK_HIGH;
		PY_Delay_us_t(1);
		DAC8552_SCLK_LOW;
		PY_Delay_us_t(1);
	}

	DAC8552_SYNC_HIGH;

    __enable_irq() ;  //enable all interrupts

}

void DAC8552_Set_PowerDown_100K_B(void)
{

	uint8_t CMD = 0;
	uint32_t WriteData = 0;

	__disable_irq() ; //disable all interrupts

    CMD = 0x26;
    WriteData = (CMD<<16);

	DAC8552_SYNC_HIGH;
	PY_Delay_us_t(1);
	DAC8552_SYNC_LOW;

	for(uint8_t i=0;i<24;i++)
	{
		if( (WriteData << i) & 0x800000 )
		{
			DAC8552_DIN_HIGH;
		}
		else
		{
			DAC8552_DIN_LOW;
		}

		DAC8552_SCLK_HIGH;
		PY_Delay_us_t(1);
		DAC8552_SCLK_LOW;
		PY_Delay_us_t(1);
	}

	DAC8552_SYNC_HIGH;

    __enable_irq() ;  //enable all interrupts

}

void DAC8552_Set_PowerDown_100K_AB(void)
{

	uint8_t CMD = 0;
	uint32_t WriteData = 0;

	__disable_irq() ; //disable all interrupts

    CMD = 0x12;
    WriteData = (CMD<<16);

	DAC8552_SYNC_HIGH;
	PY_Delay_us_t(1);
	DAC8552_SYNC_LOW;

	for(uint8_t i=0;i<24;i++)
	{
		if( (WriteData << i) & 0x800000 )
		{
			DAC8552_DIN_HIGH;
		}
		else
		{
			DAC8552_DIN_LOW;
		}

		DAC8552_SCLK_HIGH;
		PY_Delay_us_t(1);
		DAC8552_SCLK_LOW;
		PY_Delay_us_t(1);
	}

	DAC8552_SYNC_HIGH;


    CMD = 0x26;
    WriteData = (CMD<<16);

	DAC8552_SYNC_HIGH;
	PY_Delay_us_t(1);
	DAC8552_SYNC_LOW;

	for(uint8_t i=0;i<24;i++)
	{
		if( (WriteData << i) & 0x800000 )
		{
			DAC8552_DIN_HIGH;
		}
		else
		{
			DAC8552_DIN_LOW;
		}

		DAC8552_SCLK_HIGH;
		PY_Delay_us_t(1);
		DAC8552_SCLK_LOW;
		PY_Delay_us_t(1);
	}

	DAC8552_SYNC_HIGH;

    __enable_irq() ;  //enable all interrupts

}

void DAC8552_Set_PowerDown_Hz_A(void)
{

	uint8_t CMD = 0;
	uint32_t WriteData = 0;

	__disable_irq() ; //disable all interrupts

    CMD = 0x13;
    WriteData = (CMD<<16);

	DAC8552_SYNC_HIGH;
	PY_Delay_us_t(1);
	DAC8552_SYNC_LOW;

	for(uint8_t i=0;i<24;i++)
	{
		if( (WriteData << i) & 0x800000 )
		{
			DAC8552_DIN_HIGH;
		}
		else
		{
			DAC8552_DIN_LOW;
		}

		DAC8552_SCLK_HIGH;
		PY_Delay_us_t(1);
		DAC8552_SCLK_LOW;
		PY_Delay_us_t(1);
	}

	DAC8552_SYNC_HIGH;

    __enable_irq() ;  //enable all interrupts

}

void DAC8552_Set_PowerDown_Hz_B(void)
{

	uint8_t CMD = 0;
	uint32_t WriteData = 0;

	__disable_irq() ; //disable all interrupts

    CMD = 0x27;
    WriteData = (CMD<<16);

	DAC8552_SYNC_HIGH;
	PY_Delay_us_t(1);
	DAC8552_SYNC_LOW;

	for(uint8_t i=0;i<24;i++)
	{
		if( (WriteData << i) & 0x800000 )
		{
			DAC8552_DIN_HIGH;
		}
		else
		{
			DAC8552_DIN_LOW;
		}

		DAC8552_SCLK_HIGH;
		PY_Delay_us_t(1);
		DAC8552_SCLK_LOW;
		PY_Delay_us_t(1);
	}

	DAC8552_SYNC_HIGH;

    __enable_irq() ;  //enable all interrupts

}

void DAC8552_Set_PowerDown_Hz_AB(void)
{

	uint8_t CMD = 0;
	uint32_t WriteData = 0;

	__disable_irq() ; //disable all interrupts

    CMD = 0x13;
    WriteData = (CMD<<16);

	DAC8552_SYNC_HIGH;
	PY_Delay_us_t(1);
	DAC8552_SYNC_LOW;

	for(uint8_t i=0;i<24;i++)
	{
		if( (WriteData << i) & 0x800000 )
		{
			DAC8552_DIN_HIGH;
		}
		else
		{
			DAC8552_DIN_LOW;
		}

		DAC8552_SCLK_HIGH;
		PY_Delay_us_t(1);
		DAC8552_SCLK_LOW;
		PY_Delay_us_t(1);
	}

	DAC8552_SYNC_HIGH;


    CMD = 0x27;
    WriteData = (CMD<<16);

	DAC8552_SYNC_HIGH;
	PY_Delay_us_t(1);
	DAC8552_SYNC_LOW;

	for(uint8_t i=0;i<24;i++)
	{
		if( (WriteData << i) & 0x800000 )
		{
			DAC8552_DIN_HIGH;
		}
		else
		{
			DAC8552_DIN_LOW;
		}

		DAC8552_SCLK_HIGH;
		PY_Delay_us_t(1);
		DAC8552_SCLK_LOW;
		PY_Delay_us_t(1);
	}

	DAC8552_SYNC_HIGH;

    __enable_irq() ;  //enable all interrupts

}

就可以進(jìn)行函數(shù)調(diào)用實(shí)現(xiàn)控制DAC8552雙路的電壓輸出值。如控制A路為DAC8552參考電壓的1/2, B路輸出為DAC8552參考電壓的3/4:

  DAC8552_Set_Channel_A(32768);
  DAC8552_Set_Channel_B(49152);

完整的main.c代碼如下:

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @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.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
__IO float usDelayBase;
void PY_usDelayTest(void)
{
  __IO uint32_t firstms, secondms;
  __IO uint32_t counter = 0;

  firstms = HAL_GetTick()+1;
  secondms = firstms+1;

  while(uwTick!=firstms) ;

  while(uwTick!=secondms) counter++;

  usDelayBase = ((float)counter)/1000;
}

void PY_Delay_us_t(uint32_t Delay)
{
  __IO uint32_t delayReg;
  __IO uint32_t usNum = (uint32_t)(Delay*usDelayBase);

  delayReg = 0;
  while(delayReg!=usNum) delayReg++;
}

void PY_usDelayOptimize(void)
{
  __IO uint32_t firstms, secondms;
  __IO float coe = 1.0;

  firstms = HAL_GetTick();
  PY_Delay_us_t(1000000) ;
  secondms = HAL_GetTick();

  coe = ((float)1000)/(secondms-firstms);
  usDelayBase = coe*usDelayBase;
}


void PY_Delay_us(uint32_t Delay)
{
  __IO uint32_t delayReg;

  __IO uint32_t msNum = Delay/1000;
  __IO uint32_t usNum = (uint32_t)((Delay%1000)*usDelayBase);

  if(msNum>0) HAL_Delay(msNum);

  delayReg = 0;
  while(delayReg!=usNum) delayReg++;
}
/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define   DAC8552_SYNC_LOW    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);
#define   DAC8552_SYNC_HIGH   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
#define   DAC8552_DIN_LOW     HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
#define   DAC8552_DIN_HIGH    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);
#define   DAC8552_SCLK_LOW    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
#define   DAC8552_SCLK_HIGH   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);

void DAC8552_Set_Channel_A(uint16_t Data)
{
	uint8_t CMD = 0;
	uint32_t WriteData = 0;

	__disable_irq() ; //disable all interrupts

    CMD = 0x10;
	WriteData = (CMD<<16) | Data;

	DAC8552_SYNC_HIGH;
	PY_Delay_us_t(1);
	DAC8552_SYNC_LOW;

	for(uint8_t i=0;i<24;i++)
	{
		if( (WriteData << i) & 0x800000 )
		{
			DAC8552_DIN_HIGH;
		}
		else
		{
			DAC8552_DIN_LOW;
		}

		DAC8552_SCLK_HIGH;
		PY_Delay_us_t(1);
		DAC8552_SCLK_LOW;
		PY_Delay_us_t(1);
	}

	DAC8552_SYNC_HIGH;

    __enable_irq() ;  //enable all interrupts
}

void DAC8552_Set_Channel_B(uint16_t Data)
{
	uint8_t CMD = 0;
	uint32_t WriteData = 0;

	__disable_irq() ; //disable all interrupts

    CMD = 0x24;
	WriteData = (CMD<<16) | Data;

	DAC8552_SYNC_HIGH;
	PY_Delay_us_t(1);
	DAC8552_SYNC_LOW;

	for(uint8_t i=0;i<24;i++)
	{
		if( (WriteData << i) & 0x800000 )
		{
			DAC8552_DIN_HIGH;
		}
		else
		{
			DAC8552_DIN_LOW;
		}

		DAC8552_SCLK_HIGH;
		PY_Delay_us_t(1);
		DAC8552_SCLK_LOW;
		PY_Delay_us_t(1);
	}

	DAC8552_SYNC_HIGH;

    __enable_irq() ;  //enable all interrupts
}


void DAC8552_Set_Channel_AB(uint16_t Data)
{
	uint8_t CMD = 0;
	uint32_t WriteData = 0;

	__disable_irq() ; //disable all interrupts

    CMD = 0x10;
	WriteData = (CMD<<16) | Data;

	DAC8552_SYNC_HIGH;
	PY_Delay_us_t(1);
	DAC8552_SYNC_LOW;

	for(uint8_t i=0;i<24;i++)
	{
		if( (WriteData << i) & 0x800000 )
		{
			DAC8552_DIN_HIGH;
		}
		else
		{
			DAC8552_DIN_LOW;
		}

		DAC8552_SCLK_HIGH;
		PY_Delay_us_t(1);
		DAC8552_SCLK_LOW;
		PY_Delay_us_t(1);
	}

	DAC8552_SYNC_HIGH;


    CMD = 0x24;
	WriteData = (CMD<<16) | Data;

	DAC8552_SYNC_HIGH;
	PY_Delay_us_t(1);
	DAC8552_SYNC_LOW;

	for(uint8_t i=0;i<24;i++)
	{
		if( (WriteData << i) & 0x800000 )
		{
			DAC8552_DIN_HIGH;
		}
		else
		{
			DAC8552_DIN_LOW;
		}

		DAC8552_SCLK_HIGH;
		PY_Delay_us_t(1);
		DAC8552_SCLK_LOW;
		PY_Delay_us_t(1);
	}

	DAC8552_SYNC_HIGH;

    __enable_irq() ;  //enable all interrupts
}

void DAC8552_Set_PowerDown_1K_A(void)
{

	uint8_t CMD = 0;
	uint32_t WriteData = 0;

	__disable_irq() ; //disable all interrupts

    CMD = 0x11;
    WriteData = (CMD<<16);

	DAC8552_SYNC_HIGH;
	PY_Delay_us_t(1);
	DAC8552_SYNC_LOW;

	for(uint8_t i=0;i<24;i++)
	{
		if( (WriteData << i) & 0x800000 )
		{
			DAC8552_DIN_HIGH;
		}
		else
		{
			DAC8552_DIN_LOW;
		}

		DAC8552_SCLK_HIGH;
		PY_Delay_us_t(1);
		DAC8552_SCLK_LOW;
		PY_Delay_us_t(1);
	}

	DAC8552_SYNC_HIGH;

    __enable_irq() ;  //enable all interrupts

}

void DAC8552_Set_PowerDown_1K_B(void)
{

	uint8_t CMD = 0;
	uint32_t WriteData = 0;

	__disable_irq() ; //disable all interrupts

    CMD = 0x25;
    WriteData = (CMD<<16);

	DAC8552_SYNC_HIGH;
	PY_Delay_us_t(1);
	DAC8552_SYNC_LOW;

	for(uint8_t i=0;i<24;i++)
	{
		if( (WriteData << i) & 0x800000 )
		{
			DAC8552_DIN_HIGH;
		}
		else
		{
			DAC8552_DIN_LOW;
		}

		DAC8552_SCLK_HIGH;
		PY_Delay_us_t(1);
		DAC8552_SCLK_LOW;
		PY_Delay_us_t(1);
	}

	DAC8552_SYNC_HIGH;

    __enable_irq() ;  //enable all interrupts

}

void DAC8552_Set_PowerDown_1K_AB(void)
{

	uint8_t CMD = 0;
	uint32_t WriteData = 0;

	__disable_irq() ; //disable all interrupts

    CMD = 0x11;
    WriteData = (CMD<<16);

	DAC8552_SYNC_HIGH;
	PY_Delay_us_t(1);
	DAC8552_SYNC_LOW;

	for(uint8_t i=0;i<24;i++)
	{
		if( (WriteData << i) & 0x800000 )
		{
			DAC8552_DIN_HIGH;
		}
		else
		{
			DAC8552_DIN_LOW;
		}

		DAC8552_SCLK_HIGH;
		PY_Delay_us_t(1);
		DAC8552_SCLK_LOW;
		PY_Delay_us_t(1);
	}

	DAC8552_SYNC_HIGH;


    CMD = 0x25;
    WriteData = (CMD<<16);

	DAC8552_SYNC_HIGH;
	PY_Delay_us_t(1);
	DAC8552_SYNC_LOW;

	for(uint8_t i=0;i<24;i++)
	{
		if( (WriteData << i) & 0x800000 )
		{
			DAC8552_DIN_HIGH;
		}
		else
		{
			DAC8552_DIN_LOW;
		}

		DAC8552_SCLK_HIGH;
		PY_Delay_us_t(1);
		DAC8552_SCLK_LOW;
		PY_Delay_us_t(1);
	}

	DAC8552_SYNC_HIGH;

    __enable_irq() ;  //enable all interrupts

}


void DAC8552_Set_PowerDown_100K_A(void)
{

	uint8_t CMD = 0;
	uint32_t WriteData = 0;

	__disable_irq() ; //disable all interrupts

    CMD = 0x12;
    WriteData = (CMD<<16);

	DAC8552_SYNC_HIGH;
	PY_Delay_us_t(1);
	DAC8552_SYNC_LOW;

	for(uint8_t i=0;i<24;i++)
	{
		if( (WriteData << i) & 0x800000 )
		{
			DAC8552_DIN_HIGH;
		}
		else
		{
			DAC8552_DIN_LOW;
		}

		DAC8552_SCLK_HIGH;
		PY_Delay_us_t(1);
		DAC8552_SCLK_LOW;
		PY_Delay_us_t(1);
	}

	DAC8552_SYNC_HIGH;

    __enable_irq() ;  //enable all interrupts

}

void DAC8552_Set_PowerDown_100K_B(void)
{

	uint8_t CMD = 0;
	uint32_t WriteData = 0;

	__disable_irq() ; //disable all interrupts

    CMD = 0x26;
    WriteData = (CMD<<16);

	DAC8552_SYNC_HIGH;
	PY_Delay_us_t(1);
	DAC8552_SYNC_LOW;

	for(uint8_t i=0;i<24;i++)
	{
		if( (WriteData << i) & 0x800000 )
		{
			DAC8552_DIN_HIGH;
		}
		else
		{
			DAC8552_DIN_LOW;
		}

		DAC8552_SCLK_HIGH;
		PY_Delay_us_t(1);
		DAC8552_SCLK_LOW;
		PY_Delay_us_t(1);
	}

	DAC8552_SYNC_HIGH;

    __enable_irq() ;  //enable all interrupts

}

void DAC8552_Set_PowerDown_100K_AB(void)
{

	uint8_t CMD = 0;
	uint32_t WriteData = 0;

	__disable_irq() ; //disable all interrupts

    CMD = 0x12;
    WriteData = (CMD<<16);

	DAC8552_SYNC_HIGH;
	PY_Delay_us_t(1);
	DAC8552_SYNC_LOW;

	for(uint8_t i=0;i<24;i++)
	{
		if( (WriteData << i) & 0x800000 )
		{
			DAC8552_DIN_HIGH;
		}
		else
		{
			DAC8552_DIN_LOW;
		}

		DAC8552_SCLK_HIGH;
		PY_Delay_us_t(1);
		DAC8552_SCLK_LOW;
		PY_Delay_us_t(1);
	}

	DAC8552_SYNC_HIGH;


    CMD = 0x26;
    WriteData = (CMD<<16);

	DAC8552_SYNC_HIGH;
	PY_Delay_us_t(1);
	DAC8552_SYNC_LOW;

	for(uint8_t i=0;i<24;i++)
	{
		if( (WriteData << i) & 0x800000 )
		{
			DAC8552_DIN_HIGH;
		}
		else
		{
			DAC8552_DIN_LOW;
		}

		DAC8552_SCLK_HIGH;
		PY_Delay_us_t(1);
		DAC8552_SCLK_LOW;
		PY_Delay_us_t(1);
	}

	DAC8552_SYNC_HIGH;

    __enable_irq() ;  //enable all interrupts

}

void DAC8552_Set_PowerDown_Hz_A(void)
{

	uint8_t CMD = 0;
	uint32_t WriteData = 0;

	__disable_irq() ; //disable all interrupts

    CMD = 0x13;
    WriteData = (CMD<<16);

	DAC8552_SYNC_HIGH;
	PY_Delay_us_t(1);
	DAC8552_SYNC_LOW;

	for(uint8_t i=0;i<24;i++)
	{
		if( (WriteData << i) & 0x800000 )
		{
			DAC8552_DIN_HIGH;
		}
		else
		{
			DAC8552_DIN_LOW;
		}

		DAC8552_SCLK_HIGH;
		PY_Delay_us_t(1);
		DAC8552_SCLK_LOW;
		PY_Delay_us_t(1);
	}

	DAC8552_SYNC_HIGH;

    __enable_irq() ;  //enable all interrupts

}

void DAC8552_Set_PowerDown_Hz_B(void)
{

	uint8_t CMD = 0;
	uint32_t WriteData = 0;

	__disable_irq() ; //disable all interrupts

    CMD = 0x27;
    WriteData = (CMD<<16);

	DAC8552_SYNC_HIGH;
	PY_Delay_us_t(1);
	DAC8552_SYNC_LOW;

	for(uint8_t i=0;i<24;i++)
	{
		if( (WriteData << i) & 0x800000 )
		{
			DAC8552_DIN_HIGH;
		}
		else
		{
			DAC8552_DIN_LOW;
		}

		DAC8552_SCLK_HIGH;
		PY_Delay_us_t(1);
		DAC8552_SCLK_LOW;
		PY_Delay_us_t(1);
	}

	DAC8552_SYNC_HIGH;

    __enable_irq() ;  //enable all interrupts

}

void DAC8552_Set_PowerDown_Hz_AB(void)
{

	uint8_t CMD = 0;
	uint32_t WriteData = 0;

	__disable_irq() ; //disable all interrupts

    CMD = 0x13;
    WriteData = (CMD<<16);

	DAC8552_SYNC_HIGH;
	PY_Delay_us_t(1);
	DAC8552_SYNC_LOW;

	for(uint8_t i=0;i<24;i++)
	{
		if( (WriteData << i) & 0x800000 )
		{
			DAC8552_DIN_HIGH;
		}
		else
		{
			DAC8552_DIN_LOW;
		}

		DAC8552_SCLK_HIGH;
		PY_Delay_us_t(1);
		DAC8552_SCLK_LOW;
		PY_Delay_us_t(1);
	}

	DAC8552_SYNC_HIGH;


    CMD = 0x27;
    WriteData = (CMD<<16);

	DAC8552_SYNC_HIGH;
	PY_Delay_us_t(1);
	DAC8552_SYNC_LOW;

	for(uint8_t i=0;i<24;i++)
	{
		if( (WriteData << i) & 0x800000 )
		{
			DAC8552_DIN_HIGH;
		}
		else
		{
			DAC8552_DIN_LOW;
		}

		DAC8552_SCLK_HIGH;
		PY_Delay_us_t(1);
		DAC8552_SCLK_LOW;
		PY_Delay_us_t(1);
	}

	DAC8552_SYNC_HIGH;

    __enable_irq() ;  //enable all interrupts

}
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* 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();
  /* USER CODE BEGIN 2 */
  PY_usDelayTest();
  PY_usDelayOptimize();



  DAC8552_Set_Channel_A(32768);
  DAC8552_Set_Channel_B(49152);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  PY_Delay_us_t(1000000);
    /* 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};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  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_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}

/**
  * @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_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8, GPIO_PIN_SET);

  /*Configure GPIO pins : PB6 PB7 PB8 */
  GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @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 */

STM32例程下載

STM32F103C6T6模擬SPI時(shí)序控制DAC8552電壓輸出例程

–End–文章來源地址http://www.zghlxwxcb.cn/news/detail-408537.html

到了這里,關(guān)于STM32模擬SPI時(shí)序控制雙路16位數(shù)模轉(zhuǎn)換(16bit DAC)芯片DAC8552電壓輸出的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • STM32模擬SPI協(xié)議控制數(shù)字電位器MCP41010電阻值

    STM32模擬SPI協(xié)議控制數(shù)字電位器MCP41010電阻值

    MCP41010是單路8位分辨率數(shù)字電位器,通過SPI接口可控制電位器阻值分配,相當(dāng)于PW0端在PA0和PB0之間滑動(dòng)。如下圖所示: MCP41010是10K歐姆規(guī)格的數(shù)字電位器,即PA0和PB0之間的阻值恒定為10K,PW0與PA0或PW0與PB0之間的阻值互補(bǔ)可配。 另外有相關(guān)型號(hào)不同阻值規(guī)格和集成雙路的MCP系列

    2024年02月16日
    瀏覽(22)
  • STM32模擬SPI協(xié)議獲取24位模數(shù)轉(zhuǎn)換(24bit ADC)芯片AD7791電壓采樣數(shù)據(jù)

    STM32模擬SPI協(xié)議獲取24位模數(shù)轉(zhuǎn)換(24bit ADC)芯片AD7791電壓采樣數(shù)據(jù)

    STM32大部分芯片只有12位的ADC采樣性能,如果要實(shí)現(xiàn)更高精度的模數(shù)轉(zhuǎn)換如24位ADC采樣,則需要連接外部ADC實(shí)現(xiàn)。AD7791是亞德諾(ADI)半導(dǎo)體一款用于低功耗、24位Σ-Δ型模數(shù)轉(zhuǎn)換器(ADC) ,適合低頻測(cè)量應(yīng)用,提供50 Hz/60 Hz同步抑制。 這里介紹基于AD7791的24位ADC采樣實(shí)現(xiàn)。 AD7791的管腳

    2024年02月09日
    瀏覽(41)
  • STM32F103模擬SPI控制6針/7針0.96寸OLED顯示屏

    STM32F103模擬SPI控制6針/7針0.96寸OLED顯示屏

    OLED主要參數(shù) 1、高分辨率:128 64(和12864LCD相同分辨率,但該OLED屏的單位面積像素點(diǎn)多)。 2、廣可視角度:大于160°。 3、低功耗:正常顯示時(shí)0.04W。 4、寬供電范圍:直流3.3V-5V。 5、工業(yè)級(jí):工作溫度范圍-30°℃~70°℃。 6、體積?。?8.8mm 28.5mm。 7、通信方式:lIC、SPI。 8、亮

    2024年02月04日
    瀏覽(21)
  • STM32配置讀取雙路24位模數(shù)轉(zhuǎn)換(24bit ADC)芯片CS1238數(shù)據(jù)

    STM32配置讀取雙路24位模數(shù)轉(zhuǎn)換(24bit ADC)芯片CS1238數(shù)據(jù)

    CS1238是一款國(guó)產(chǎn)雙路24位ADC芯片,與CS1238對(duì)應(yīng)的單路24位ADC芯片是CS1237,功能上相當(dāng)于HX711和TM7711的組合。其功能如下所示: 市面上的模塊: CS1238內(nèi)部原理如下所示, VDD是DVDD和AVDD的合并: 有單獨(dú)的參考電壓輸入設(shè)置管腳,以及內(nèi)部輸出與VDD同電壓的參考輸出電壓,可選連接到

    2024年02月16日
    瀏覽(26)
  • STM32的HAL庫SPI操作(master 模式)-根據(jù)時(shí)序圖配置SPI

    STM32的HAL庫SPI操作(master 模式)-根據(jù)時(shí)序圖配置SPI

    SPI基本概念請(qǐng)自行百度,參考:百度百科SPI簡(jiǎn)介.我們講重點(diǎn)和要注意的地方。 接線一一對(duì)應(yīng) 也就是說主控的MISO,MOSI,SCLK,[CSn]分別和設(shè)備的MISO,MOSI,SCLK,[CSn]一一對(duì)應(yīng)相連,不交叉,不交叉,不交叉…(重要的事情說三遍)。 這是無線模塊CC2500的SPI接口時(shí)序,這里可以看到,從

    2024年02月06日
    瀏覽(23)
  • STM32開發(fā)_利用SPI協(xié)議讀寫SD卡、介紹SD卡SPI時(shí)序

    STM32開發(fā)_利用SPI協(xié)議讀寫SD卡、介紹SD卡SPI時(shí)序

    目錄 一、?? SD卡引腳接口功能介紹 1.1 SD卡引腳接口圖 1.2 SPI方式驅(qū)動(dòng)SD卡介紹 1.3 開發(fā)板接口定義 二、MMC卡、SD卡介紹 2.1 SD卡和MMC兩者間區(qū)別 2.2 SD卡版本說明 2.3 SD卡常用的指令表 三、向SD卡發(fā)送命令的步驟介紹(SendSDCardCmd) 3.1 取消選中SD卡(SDCardCancelCS) 3.2 選中SD卡(SDCardSele

    2024年02月16日
    瀏覽(22)
  • 【STM32學(xué)習(xí)】——SPI通信協(xié)議&SPI時(shí)序&W25Q64存儲(chǔ)芯片&軟件SPI讀寫

    【STM32學(xué)習(xí)】——SPI通信協(xié)議&SPI時(shí)序&W25Q64存儲(chǔ)芯片&軟件SPI讀寫

    目錄 前言 一、SPI通信協(xié)議 1.概述? 2.硬件電路 ?3.移位示意圖 二、SPI時(shí)序 1.時(shí)序基本單元 2.完整時(shí)序波形 三、W25Q64存儲(chǔ)芯片 1.芯片簡(jiǎn)介 ?2.硬件電路引腳定義 ?3.芯片框圖 4.Flash操作注意事項(xiàng) 四、軟件SPI讀寫W25Q64 五、SPI通信外設(shè) 總結(jié) 聲明:學(xué)習(xí)筆記來自江科大自化協(xié)B站教

    2024年02月09日
    瀏覽(21)
  • STM32F407 SPI配置和時(shí)序圖講解(二)

    STM32F407 SPI配置和時(shí)序圖講解(二)

    上節(jié)講了SPI的基本配置,這節(jié)主要講解 如何看時(shí)序圖 ,SPI數(shù)據(jù)到底是如何傳輸?shù)摹?SPI初始化后,就可以開始向?qū)ο蟀l(fā)送數(shù)據(jù)了,但是要發(fā)送數(shù)據(jù)給W25Q128模塊,需要按照它的時(shí)序圖來發(fā)送( 個(gè)人用的是W25Q128模塊 ) W25Q128模塊簡(jiǎn)介 W25Q128是一款常見的串行閃存存儲(chǔ)器模塊,屬

    2024年02月06日
    瀏覽(29)
  • STM32 軟件模擬SPI

    STM32 軟件模擬SPI

    STM32庫:標(biāo)準(zhǔn)函數(shù)庫 測(cè)試環(huán)境:STM32F103系列 SPI(Serial Peripheral Interface,串行外設(shè)接口)是由摩托羅拉(Motorola)在1980前后提出的一種全雙工同步串行通信接口,它用于MCU與各種外圍設(shè)備以串行方式進(jìn)行通信以交換信息,通信速度最高可達(dá)25MHz以上。 SPI接口主要應(yīng)用在EEPROM、

    2024年02月09日
    瀏覽(20)
  • STM32模擬SPI的程序

    最近完成的一個(gè)項(xiàng)目因?yàn)镾PI管腳被別的資源占用了,只能通過模擬SPI對(duì)存儲(chǔ)器進(jìn)行操作。最后測(cè)試發(fā)現(xiàn)模擬SPI的速度也很快,和硬件SPI相比感覺不到太大的差異?,F(xiàn)將模擬SPI的程序分享如下: 管腳定義,大家可以根據(jù)需要自行修改,任何一個(gè)GPIO都可以模擬SPI 模擬SPI MOSI MOS

    2024年02月12日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包