请基于 F28335和DAC7724芯片设计定时DA输出锯齿波和正弦波,列出具体代码
时间: 2024-02-03 19:14:19 浏览: 26
好的,基于F28335和DAC7724芯片,以下是锯齿波和正弦波的代码实现:
1. 锯齿波输出代码:
```
#include "F28x_Project.h"
#define DAC_SPIREGS ((SPI_REGS*)0x00000A00)
void DAC_config(void)
{
// 启用SPI模块
EALLOW;
ClkCfgRegs.LOSPCP.bit.LSPCLKDIV = 0x0000;
CpuSysRegs.PCLKCR0.bit.SPIAENCLK = 0x1;
EDIS;
// 配置SPI模块
DAC_SPIREGS->SPICCR.bit.SPISWRESET = 0; // 关闭SPI软件复位
DAC_SPIREGS->SPICTL.bit.CLK_PHASE = 0; // 时钟相位为正常(SPI模式0)
DAC_SPIREGS->SPICTL.bit.MASTER_SLAVE = 1; // 主模式
DAC_SPIREGS->SPICTL.bit.TALK = 1; // 允许发送数据
DAC_SPIREGS->SPICTL.bit.SPIINTENA = 0; // 禁止SPI中断
DAC_SPIREGS->SPIBRR.bit.SPI_BIT_RATE = 0; // 波特率 = LSPCLK/4
DAC_SPIREGS->SPICCR.bit.SPICHAR = 0xF; // 16位数据帧
DAC_SPIREGS->SPICCR.bit.SPILBK = 0; // 关闭SPI循环测试
DAC_SPIREGS->SPICCR.bit.CLKPOLARITY = 0; // 时钟极性为低电平有效
DAC_SPIREGS->SPICCR.bit.SPISWRESET = 1; // 打开SPI软件复位
// 配置DAC
GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 0x3; // 将GPIO20配置为SPI_SIMO
GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 0x3; // 将GPIO22配置为SPI_CLK
GpioCtrlRegs.GPADIR.bit.GPIO19 = 1; // 将GPIO19配置为DAC7724的SYNC引脚
GpioDataRegs.GPASET.bit.GPIO19 = 1; // 将SYNC引脚拉高
// 发送配置命令给DAC
Uint16 dac_config = 0x2000; // 配置命令为0x2000
Uint16 dac_data = 0xFFFF; // 配置数据为0xFFFF
Uint16 dac_tx = (dac_config << 16) | dac_data;
Uint16 dac_rx = 0;
GpioDataRegs.GPACLEAR.bit.GPIO19 = 1; // 将SYNC引脚拉低
DAC_SPIREGS->SPITXBUF = dac_tx; // 发送配置命令
while(DAC_SPIREGS->SPISTS.bit.INT_FLAG == 0); // 等待发送完成
dac_rx = DAC_SPIREGS->SPIRXBUF; // 读取DAC返回的数据
GpioDataRegs.GPASET.bit.GPIO19 = 1; // 将SYNC引脚拉高
}
void DAC_output_sawtooth(void)
{
Uint16 dac_tx = 0;
Uint16 dac_rx = 0;
Uint16 dac_data = 0;
for(Uint16 i=0;i<1024;i++)
{
dac_data = i << 4; // 生成锯齿波数据
dac_tx = (0x8000 | dac_data) << 16; // 配置命令为0x8000,数据为dac_data
GpioDataRegs.GPACLEAR.bit.GPIO19 = 1; // 将SYNC引脚拉低
DAC_SPIREGS->SPITXBUF = dac_tx; // 发送数据
while(DAC_SPIREGS->SPISTS.bit.INT_FLAG == 0); // 等待发送完成
dac_rx = DAC_SPIREGS->SPIRXBUF; // 读取DAC返回的数据
GpioDataRegs.GPASET.bit.GPIO19 = 1; // 将SYNC引脚拉高
DELAY_US(10); // 延时10us
}
}
void main(void)
{
InitSysCtrl();
DAC_config();
DAC_output_sawtooth();
while(1);
}
```
2. 正弦波输出代码:
```
#include "F28x_Project.h"
#define DAC_SPIREGS ((SPI_REGS*)0x00000A00)
void DAC_config(void)
{
// 启用SPI模块
EALLOW;
ClkCfgRegs.LOSPCP.bit.LSPCLKDIV = 0x0000;
CpuSysRegs.PCLKCR0.bit.SPIAENCLK = 0x1;
EDIS;
// 配置SPI模块
DAC_SPIREGS->SPICCR.bit.SPISWRESET = 0; // 关闭SPI软件复位
DAC_SPIREGS->SPICTL.bit.CLK_PHASE = 0; // 时钟相位为正常(SPI模式0)
DAC_SPIREGS->SPICTL.bit.MASTER_SLAVE = 1; // 主模式
DAC_SPIREGS->SPICTL.bit.TALK = 1; // 允许发送数据
DAC_SPIREGS->SPICTL.bit.SPIINTENA = 0; // 禁止SPI中断
DAC_SPIREGS->SPIBRR.bit.SPI_BIT_RATE = 0; // 波特率 = LSPCLK/4
DAC_SPIREGS->SPICCR.bit.SPICHAR = 0xF; // 16位数据帧
DAC_SPIREGS->SPICCR.bit.SPILBK = 0; // 关闭SPI循环测试
DAC_SPIREGS->SPICCR.bit.CLKPOLARITY = 0; // 时钟极性为低电平有效
DAC_SPIREGS->SPICCR.bit.SPISWRESET = 1; // 打开SPI软件复位
// 配置DAC
GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 0x3; // 将GPIO20配置为SPI_SIMO
GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 0x3; // 将GPIO22配置为SPI_CLK
GpioCtrlRegs.GPADIR.bit.GPIO19 = 1; // 将GPIO19配置为DAC7724的SYNC引脚
GpioDataRegs.GPASET.bit.GPIO19 = 1; // 将SYNC引脚拉高
// 发送配置命令给DAC
Uint16 dac_config = 0x2000; // 配置命令为0x2000
Uint16 dac_data = 0xFFFF; // 配置数据为0xFFFF
Uint16 dac_tx = (dac_config << 16) | dac_data;
Uint16 dac_rx = 0;
GpioDataRegs.GPACLEAR.bit.GPIO19 = 1; // 将SYNC引脚拉低
DAC_SPIREGS->SPITXBUF = dac_tx; // 发送配置命令
while(DAC_SPIREGS->SPISTS.bit.INT_FLAG == 0); // 等待发送完成
dac_rx = DAC_SPIREGS->SPIRXBUF; // 读取DAC返回的数据
GpioDataRegs.GPASET.bit.GPIO19 = 1; // 将SYNC引脚拉高
}
void DAC_output_sin(void)
{
Uint16 dac_tx = 0;
Uint16 dac_rx = 0;
Uint16 dac_data = 0;
for(Uint16 i=0;i<1024;i++)
{
dac_data = (Uint16)(32767 * sin(2 * PI * i / 1024) + 32768); // 生成正弦波数据
dac_tx = (0x8000 | dac_data) << 16; // 配置命令为0x8000,数据为dac_data
GpioDataRegs.GPACLEAR.bit.GPIO19 = 1; // 将SYNC引脚拉低
DAC_SPIREGS->SPITXBUF = dac_tx; // 发送数据
while(DAC_SPIREGS->SPISTS.bit.INT_FLAG == 0); // 等待发送完成
dac_rx = DAC_SPIREGS->SPIRXBUF; // 读取DAC返回的数据
GpioDataRegs.GPASET.bit.GPIO19 = 1; // 将SYNC引脚拉高
DELAY_US(10); // 延时10us
}
}
void main(void)
{
InitSysCtrl();
DAC_config();
DAC_output_sin();
while(1);
}
```
以上是基于F28335和DAC7724芯片实现锯齿波和正弦波输出的代码。需要注意的是,DAC7724芯片有4个输出通道,可以输出4路模拟信号,以上代码只实现了其中一路输出,如果需要多路输出,需要对代码进行相应修改。