#include "AD5770.h" #include "../SystemDriver/pinsel/lpc177x_8x_pinsel.h" #include "../SystemDriver/GPIO/lpc177x_8x_gpio.h" #include "../SystemDriver/ssp/ssp.h" /************************************************************************************* * AD5770 通道功能说明 (电流单位mA) AD5770_CH CHIP_I_MAX FUN LD_I_MAX MODE SCALIN OUTPUT_I_MAX CH0 300 PUMP 300 0(0~300) 0 300 CH1 250 SOA 150 1(0~140) 0 140 CH2 150 IG 150 1(0~150) 0 150 CH3 100 IL 30 0(0~45) 43 30 CH4 100 IR 30 0(0~45) 43 30 CH5 100 IP 10 0(0~45) 63 23 ************************************************************************************/ //AD5770 SPI0 CLK 20MHz /************************************************************************************* * AD5770控制管脚描述 * --RESET P2.5 * --/LDAC P2.21 ************************************************************************************/ #define AD5770_RESET (0x01<<5) #define AD5770_LDAC (0x01<<21) unsigned char ad5770_send_buff[10]; /************************************************************************************* * 函数名称: AD5770_Init * * 功能描述: 初始化恒流源AD5770,设置LPC1788管脚,复位, * * 入口参数: * * 出口参数: * ************************************************************************************/ void AD5770_Init(void) { uint32_t i=0; //端口设置 PINSEL_ConfigPin(2,5,0); PINSEL_ConfigPin(2,21,0); PINSEL_SetPinMode(2,5,PINSEL_BASICMODE_PLAINOUT); PINSEL_SetPinMode(2,21,PINSEL_BASICMODE_PLAINOUT); GPIO_SetDir(2,AD5770_RESET ,1); GPIO_SetDir(2,AD5770_LDAC,1); GPIO_SetValue(2,AD5770_RESET); GPIO_ClearValue(2,AD5770_LDAC); //复位 GPIO_ClearValue(2,AD5770_RESET); GPIO_SetValue(2,AD5770_RESET); for(i=0;i<50000;i++){;} //配置AD5770模式寄存器 ad5770_send_buff[0]=0x1A; // 寄存器地址 0x1a ad5770_send_buff[1]=0xFC; //CH5 scalling mod // ad5770_send_buff[2]=0xAC; //CH4 scalling mod // ad5770_send_buff[3]=0xAC; //CH3 scalling mod ad5770_send_buff[2]=0x00; //CH4 scalling mod ad5770_send_buff[3]=0x00; //CH3 scalling mod ad5770_send_buff[4]=0x01; //CH2 scalling mod ad5770_send_buff[5]=0x01; //CH1 scalling mod ad5770_send_buff[6]=0x00; //CH0 scalling mod SSP_SSELToggle(0,3,0); SSPSend(0,ad5770_send_buff,7); SSP_SSELToggle(0,3,1); //设置参考电压,外部REF1.25V ad5770_send_buff[0]=0x1B; // 寄存器地址 0x1B ad5770_send_buff[1]=0x02; SSP_SSELToggle(0,3,0); SSPSend(0,ad5770_send_buff,2); SSP_SSELToggle(0,3,1); //开启电流输出 ad5770_send_buff[0]=0x14; // 寄存器地址 0x14 ad5770_send_buff[1]=0x3f; SSP_SSELToggle(0,3,0); SSPSend(0,ad5770_send_buff,2); SSP_SSELToggle(0,3,1); } /************************************************************************************* * 函数名称: AD5770_SetCH0Current * * 功能描述: 设置通道0 电流,输出到PUMP * * 入口参数: i,电流,单位mA * * 出口参数: * ************************************************************************************/ void AD5770_SetCH0Current(uint16_t i) { uint16_t dac; dac=(uint32_t)i*16383/300; dac = dac << 2; ad5770_send_buff[0]=0x39; ad5770_send_buff[1]=dac>>8; ad5770_send_buff[2]=dac; SSP_SSELToggle(0,3,0); SSPSend(0,ad5770_send_buff,3); SSP_SSELToggle(0,3,1); } /************************************************************************************* * 函数名称: AD5770_SetCH1Current * * 功能描述: 设置通道1 电流,输出到SOA * * 入口参数: i,电流,单位mA * * 出口参数: * ************************************************************************************/ void AD5770_SetCH1Current(uint16_t i) { uint16_t dac; dac=(uint32_t)i*16383/140; dac = dac << 2; ad5770_send_buff[0]=0x3B; ad5770_send_buff[1]=dac>>8; ad5770_send_buff[2]=dac; SSP_SSELToggle(0,3,0); SSPSend(0,ad5770_send_buff,3); SSP_SSELToggle(0,3,1); } /************************************************************************************* * 函数名称: AD5770_SetCH2Current * * 功能描述: 设置通道2 电流,输出到IG * * 入口参数: i,电流,单位mA * * 出口参数: * ************************************************************************************/ void AD5770_SetCH2Current(uint16_t i) { uint16_t dac; dac=(uint32_t)i*16383/150; dac = dac << 2; ad5770_send_buff[0]=0x3D; ad5770_send_buff[1]=dac>>8; ad5770_send_buff[2]=dac; SSP_SSELToggle(0,3,0); SSPSend(0,ad5770_send_buff,3); SSP_SSELToggle(0,3,1); } /************************************************************************************* * 函数名称: AD5770_SetCH543Current * * 功能描述: 设置通道5,4,3 电流,输出到IP,IR,IL * * 入口参数: i,电流,单位uA * * 出口参数: * ************************************************************************************/ void AD5770_SetCH543Current(uint16_t i5,uint16_t i4,uint16_t i3) { uint16_t dac; dac=(uint32_t)i5*16383/23000; dac = dac << 2; ad5770_send_buff[0]=0x43; ad5770_send_buff[1]=dac>>8; ad5770_send_buff[2]=dac; dac=(uint32_t)i4*16383/30000; dac = dac << 2; ad5770_send_buff[3]=dac>>8; ad5770_send_buff[4]=dac; dac=(uint32_t)i3*16383/30000; dac = dac << 2; ad5770_send_buff[5]=dac>>8; ad5770_send_buff[6]=dac; SSP_SSELToggle(0,3,0); SSPSend(0,ad5770_send_buff,7); SSP_SSELToggle(0,3,1); }
时间: 2025-05-29 18:04:20 AIGC 浏览: 42 评论: 7
### AD570初始化代码与SPI通信配置
#### 1. LPC1788 SPI通信配置
LPC1788 的 SPI 配置可以通过设置 `PINSEL` 寄存器以及相关的控制寄存器完成。以下是基于引用中的内容扩展的 SPI 配置方法:
```c
// 初始化SPI外设时钟和引脚
void Init_SPI(void) {
// 启用SPI模块时钟
LPC_SC->PCONP |= (1 << 21); // 打开SSP控制器电源[^1]
// 设置SPI引脚功能选择
LPC_PINCON->PINSEL0 |= (0x03ul << 30); // 设置P0.15为SCK引脚
LPC_PINCON->PINSEL1 &= ~(0x03 << 0); // P0.16保留为GPIO
LPC_GPIO0->FIODIR |= SPI2_CS; // 设置CS引脚为输出
LPC_PINCON->PINSEL1 |= (0x03 << 2) | (0x03 << 4); // 设置P0.17、P0.18为SPI引脚
// 配置SSP控制寄存器
LPC_SSP1->CR0 = (7 << 0) | (0 << 4) | (0 << 8); // 数据宽度为8位,帧格式为主模式
LPC_SSP1->CPSR = 2; // 主时钟预分频系数为2
LPC_SSP1->CR1 = (1 << 1) | (1 << 2); // 启动SSP并进入主模式
}
```
#### 2. AD5770初始化代码
AD5770 是一款高精度DAC芯片,支持通过SPI接口进行配置。其初始化过程通常包括以下几个方面:
- **写入控制字**:用于设定工作模式(单缓冲/双缓冲)、更新方式等。
- **写入数据字**:指定DAC输出值。
以下是一个典型的初始化函数实现:
```c
#include <stdint.h>
#define AD5770_CMD_WRITE_CTRL_REG 0x00
#define AD5770_CMD_WRITE_DATA 0x01
#define AD5770_ADDR_CONTROL_REGISTER 0x00
#define AD5770_ADDR_DAC_REGISTER 0x01
// 发送命令并通过SPI发送数据
void Send_SPI_Command(uint8_t cmd, uint16_t data) {
uint8_t buffer[3];
buffer[0] = cmd;
buffer[1] = (data >> 8) & 0xFF;
buffer[2] = data & 0xFF;
// 使用SSP发送数据
while (!(LPC_SSP1->SR & (1 << 5))); // 等待TX FIFO为空
LPC_SSP1->DR = buffer[0]; // 发送第一个字节
while (!(LPC_SSP1->SR & (1 << 5)));
LPC_SSP1->DR = buffer[1]; // 发送第二个字节
while (!(LPC_SSP1->SR & (1 << 5)));
LPC_SSP1->DR = buffer[2]; // 发送第三个字节
}
// 初始化AD5770 DAC
void Initialize_AD5770(void) {
// 写入控制寄存器,默认配置
Send_SPI_Command((AD5770_CMD_WRITE_CTRL_REG << 4), AD5770_ADDR_CONTROL_REGISTER);
// 将DAC初始值设置为零
Set_Current_Output(0);
}
// 设置电流输出值
void Set_Current_Output(uint16_t value) {
if (value > 0xFFFF) { // 确保输入范围有效
value = 0xFFFF;
}
Send_SPI_Command((AD5770_CMD_WRITE_DATA << 4), (AD5770_ADDR_DAC_REGISTER | value));
}
```
#### 3. GPIO PINSEL配置
对于LPC1788的GPIO配置,可以参考如下代码片段:
```c
void Configure_GPIO_Pin(int port, int pin, int function) {
volatile unsigned long *pinreg = NULL;
switch(port){
case 0: pinreg = &(LPC_PINCON->PINSEL0); break;
case 1: pinreg = &(LPC_PINCON->PINSEL2); break;
default: return;
}
// 计算偏移量
int offset = pin * 2;
*pinreg &= ~(0x03 << offset); // 清除原有功能
*pinreg |= ((function & 0x03) << offset); // 设置新功能
}
// 示例:将P0.16配置为GPIO
Configure_GPIO_Pin(0, 16, 0); // 功能0表示GPIO
LPC_GPIO0->FIODIR |= (1 << 16); // 设置为输出方向
```
#### 4. SSP发送数据机制
根据引用的内容[^3],SSP的数据传输依赖于双向数据寄存器。当向该寄存器写入数据时会触发一次SPI事务,直到状态标志位被清除前不可再次写入。因此,在实际应用中需注意等待事务完成后再继续操作。
---
###
阅读全文
相关推荐

















评论

行走的瓶子Yolo
2025.08.22
通过SPI发送数据的函数封装,使得控制AD5770变得简洁。

恽磊
2025.07.22
示例中给出了如何配置GPIO PINSEL,有助于理解如何为特定功能设置引脚。🍎

茶啊冲的小男孩
2025.07.02
这段代码详尽地展示了如何初始化和配置AD5770 DAC芯片,并通过LPC1788的SPI进行通信。☀️

养生的控制人
2025.05.04
代码中包含了详细的宏定义,便于理解和操作AD5770控制管脚。

伯特兰·罗卜
2025.04.29
示例中对SSP发送数据机制的描述,有助于深入理解SPI通信过程。🍎

林书尼
2025.04.20
代码注释丰富,有助于其他开发者快速理解和维护。

yiyi分析亲密关系
2025.04.11
初始化部分清晰地列出了AD5770各个通道的功能和最大电流输出限制。