连接stm32L431 IO 菊花链连接
配置cubemx 连接AD5410的4个普通IO为输出模式
开启定时器2 作为微妙的延迟
主频72M
TIM.c编写微妙的延迟(在.h在文件中说明)
void delay_us(uint16_t us) { uint16_t differ=0xffff-us-5; __HAL_TIM_SET_COUNTER(&htim2,differ); HAL_TIM_Base_Start(&htim2); while(differ<0xffff-6) { differ=__HAL_TIM_GET_COUNTER(&htim2); } HAL_TIM_Base_Stop(&htim2); }
AD5410.c
#include "AD5410.h" #include "tim.h" extern void delay_us(uint16_t us); /* 1BIT DATA */ void AD5410_SendByte(uint8_t byte) { uint8_t i; for ( i = 0; i < 8; i ) { AD5410_SCLK_LOW; if ( byte & 0x80 ) { AD5410_SDIN_HIGH ; delay_us(1); } else { AD5410_SDIN_LOW; delay_us(1); } AD5410_SCLK_HIGH; byte <<= 1; AD5410_SCLK_LOW; } } /* 3BIT DATA */ void AD5410_controlA(uint8_t addr,uint32_t data) { uint8_t Hdata,Ldata; Hdata=data>>8; Ldata=data&255; AD5410_LATCH_LOW; AD5410_SendByte(addr); AD5410_SendByte(Hdata); AD5410_SendByte(Ldata); AD5410_LATCH_HIGH; delay_us(2); } void AD5410_controlB(uint8_t addr,uint32_t data,uint32_t data1) { uint8_t Hdata,Ldata; uint8_t Hdata2,Ldata2; Hdata=data>>8; Ldata=data&255; Hdata2=data1>>8; Ldata2=data1&255; AD5410_LATCH_LOW; AD5410_SendByte(addr); AD5410_SendByte(Hdata); AD5410_SendByte(Ldata); AD5410_SendByte(addr); AD5410_SendByte(Hdata2); AD5410_SendByte(Ldata2); AD5410_LATCH_HIGH; delay_us(2); } /********************/ /* IOUT 0<=DATA<=20*/ void AD5410_IOUT(float DATA,float DATA1) { uint16_t I_OUT,I_OUT1; if(DATA>=20) { I_OUT=4095; } else { I_OUT=DATA*4096/20; } if(DATA1>=20) { I_OUT1=4095; } else if(DATA1<4) { DATA1=4; I_OUT1=DATA1*4096/20; } else { I_OUT1=DATA1*4096/20; } I_OUT=((int)I_OUT)<<4; I_OUT1=((int)I_OUT1)<<4; // AD5410_controlA(DATAreg,I_OUT); AD5410_controlB(DATAreg,I_OUT,I_OUT1); } void AD5410_init(void) { // MX_GPIO_Init(); AD5410_CLEAR_LOW; AD5410_controlA(RESETreg,RESET); AD5410_controlA(CONTROLreg, CONTROL); //0-20ma 257730更新频率 1步进大小 AD5410_controlB(0x56,0x0001,0x0000); AD5410_controlB(0x55,0x1016,0x101e); }
AD5410.h
#ifndef __AD5410_H__ #define __AD5410_H__ #include "stm32L431xx.h" #include "main.h" //gpio #define AD5410_SDIN_HIGH HAL_GPIO_WritePin (AD5410_SDIN_GPIO_Port ,AD5410_SDIN_Pin ,GPIO_PIN_SET) #define AD5410_SDIN_LOW HAL_GPIO_WritePin (AD5410_SDIN_GPIO_Port ,AD5410_SDIN_Pin ,GPIO_PIN_RESET) #define AD5410_SCLK_HIGH HAL_GPIO_WritePin (AD5410_SCLK_GPIO_Port ,AD5410_SCLK_Pin ,GPIO_PIN_SET) #define AD5410_SCLK_LOW HAL_GPIO_WritePin (AD5410_SCLK_GPIO_Port ,AD5410_SCLK_Pin ,GPIO_PIN_RESET) #define AD5410_LATCH_HIGH HAL_GPIO_WritePin (AD5410_LATCH_GPIO_Port ,AD5410_LATCH_Pin ,GPIO_PIN_SET) #define AD5410_LATCH_LOW HAL_GPIO_WritePin (AD5410_LATCH_GPIO_Port ,AD5410_LATCH_Pin ,GPIO_PIN_RESET) #define AD5410_CLEAR_HIGH HAL_GPIO_WritePin (AD5410_CLEAR_GPIO_Port ,AD5410_CLEAR_Pin ,GPIO_PIN_SET) #define AD5410_CLEAR_LOW HAL_GPIO_WritePin (AD5410_CLEAR_GPIO_Port ,AD5410_CLEAR_Pin ,GPIO_PIN_RESET) //register adress #define NOP 0x00 #define DATAreg 0x01 #define READBACKreg 0x02 #define CONTROLreg 0x55 #define RESETreg 0x56 //instruction #define RESET 0x0001 //复位指令 0000000000000001 //#define CONTROL 0x101E //0-20mA输出电流 菊花链使能 257730更新速率 1/16步进大小 #define CONTROL 0xD09E //API void AD5410_controlA(uint8_t addr,uint32_t data); void AD5410_controlB(uint8_t addr,uint32_t data,uint32_t data1); void AD5410_IOUT(float DATA,float DATA1); void AD5410_init(void); #endif