要 AI8051U SPI控制AD9833的程序示例
要 AI8051U SPI控制AD9833的程序示例关于AI8051U通过SPI接口控制AD9833的实施方案(专业版)
一、系统架构设计
1. 硬件拓扑结构
AI8051U作为主控制器,通过标准四线SPI接口连接AD9833模块:
SCLK:同步时钟线(建议配置为1-5MHz)
MOSI:主出从入数据线
CSB:片选信号(低有效)
FSYNC:专用控制线(可选并联CSB)
2. 时序参数要求
AD9833关键时序特性:
最小CSB建立时间:35ns
SCLK上升/下降时间:> 8); // 发送高字节
while(!(SPSR & 0x80));// 等待传输完成
SPDR = data & 0xFF; // 发送低字节
while(!(SPSR & 0x80));
AD9833CSB = 1; // 释放片选
}
void AD9833SetFrequency(uint32t freq)
{
uint32t freqword;
uint16t highpart, lowpart;
// 计算频率字(MCLK=25MHz时)
freqword = (uint32t)((double)freq268435456.0 / 25000000.0);
// 拆分28位数据
highpart = (freqword >> 14) & 0x3FFF;
lowpart = freqword & 0x3FFF;
// 写入频率寄存器
AD9833Write(FREQ0WRITE | highpart);
AD9833Write(FREQ0WRITE | lowpart);
}
void AD9833Init(void)
{
AD9833Write(RESETCMD); // 硬件复位
AD9833Write(SINEOUTPUT); // 配置正弦波输出
AD9833SetFrequency(1000000); // 默认1MHz输出
// 最终控制字配置
AD9833Write(0x2020); // B28=1, RESET=0
}
四、工程优化建议
1. 时序增强措施:
在关键写操作间插入5μs延时
采用DMA传输模式提升批量写入效率
增加CRC校验确保数据传输完整性
2. 抗干扰设计:
在SCLK和MOSI线上串联33Ω电阻
PCB布局时保持SPI走线长度
[本文内容由国芯人工智能辅助生成,仅供参考]
https://so.csdn.net/so/search?q=AD9833&t=blog&u=zhuoqingjoking97298
https://blog.csdn.net/zhuoqingjoking97298/article/details/144908757
https://www.bilibili.com/video/BV1XK62YdEFX/
/*
**==============================================================================
** AD9833.C: -- by Dr. ZhuoQing, 2025-01-03
**
**==============================================================================
*/
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void AD9833Init(void) {
PM_PP(AD9833_FSYNC);
ON(AD9833_FSYNC);
PM_PP(AD9833_SCLK);
ON(AD9833_SCLK);
PM_PP(AD9833_SDATA);
OFF(AD9833_SDATA);
//--------------------------------------------------------------------------
g_nAD9833Config = AD9833_CONFIG_DEF;
AD9833Reset();
AD9833WriteFrequency0(AD9833_FREQUENCY_DEF);
AD9833WritePhase0(AD9833_PHASE_DEF);
AD9833WriteFrequency1(AD9833_FREQUENCY_DEF);
AD9833WritePhase1(AD9833_PHASE_DEF);
AD9833SinusoidalOutput();
// AD9833TriangleOutput();
// AD9833SquareOutput1();
AD9833ClearReset();
}
//------------------------------------------------------------------------------
//extern SPI_HandleTypeDef hspi1;
void AD9833Write(unsigned int nWord) {
// unsigned short nInt16 = (unsigned short)nWord;
// OFF(AD9833_FSYNC);
// HAL_SPI_Transmit(&hspi1, (uint8_t *)&nInt16, 1, 1);
// ON(AD9833_FSYNC);
unsigned int nMask;
unsigned char i;
nMask = 0x8000;
OFF(AD9833_FSYNC);
for(i = 0; i < 16; i ++) {
if(nWord & nMask) ON(AD9833_SDATA);
else OFF(AD9833_SDATA);
OFF(AD9833_SCLK);
ON(AD9833_SCLK);
nMask >>= 1;
}
ON(AD9833_FSYNC);
}
//------------------------------------------------------------------------------
void AD9833Reset(void) {
g_nAD9833Config |= AD9833_CB_RESET;
AD9833Write(g_nAD9833Config);
}
void AD9833ClearReset(void) {
g_nAD9833Config &= ~AD9833_CB_RESET;
AD9833Write(g_nAD9833Config);
}
void AD9833SinusoidalOutput(void) {
g_nAD9833Config &= ~(AD9833_CB_OPBITEN | AD9833_CB_MODE);
AD9833Write(g_nAD9833Config);
}
void AD9833TriangleOutput(void) {
g_nAD9833Config &= ~(AD9833_CB_OPBITEN);
g_nAD9833Config |= AD9833_CB_MODE;
AD9833Write(g_nAD9833Config);
}
void AD9833SquareOutput(void) {
g_nAD9833Config &= ~AD9833_CB_MODE;
g_nAD9833Config |= AD9833_CB_OPBITEN;
g_nAD9833Config &= ~AD9833_CB_DIV2;
AD9833Write(g_nAD9833Config);
}
void AD9833SquareOutput1(void) {
g_nAD9833Config &= ~AD9833_CB_MODE;
g_nAD9833Config |= AD9833_CB_OPBITEN;
g_nAD9833Config |= AD9833_CB_DIV2;
AD9833Write(g_nAD9833Config);
}
//------------------------------------------------------------------------------
void AD9833WriteFrequency0(unsigned int nWord) {
unsigned int nWrite;
g_nAD9833Config |= 0x2000;
AD9833Write(g_nAD9833Config);
nWrite = nWord & 0x3fff;
nWrite |= 0x4000;
AD9833Write(nWrite);
nWrite = (nWord >> 14) & 0x3fff;
nWrite |= 0x4000;
AD9833Write(nWrite);
g_nAD9833Config &= ~0x2000;
AD9833Write(g_nAD9833Config);
}
void AD9833WriteFrequency1(unsigned int nWord) {
unsigned int nWrite;
g_nAD9833Config |= 0x2000;
AD9833Write(g_nAD9833Config);
nWrite = nWord & 0x3fff;
nWrite |= 0x8000;
AD9833Write(nWrite);
nWrite = (nWord >> 14) & 0x3fff;
nWrite |= 0x8000;
AD9833Write(nWrite);
g_nAD9833Config &= ~0x2000;
AD9833Write(g_nAD9833Config);
}
//------------------------------------------------------------------------------
void AD9833WriteFrequency0LSB(unsigned short nWord) {
g_nAD9833Config &= 0xfff;
AD9833Write(g_nAD9833Config);
// AD9833Write(0x1000);
nWord &= 0x3fff;
nWord |= 0x4000;
AD9833Write(nWord);
}
void AD9833WriteFrequency0MSB(unsigned short nWord) {
g_nAD9833Config &= 0xfff;
g_nAD9833Config |= 0x1000;
AD9833Write(g_nAD9833Config);
nWord &= 0x3fff;
nWord |= 0x4000;
AD9833Write(nWord);
}
void AD9833WriteFrequency1LSB(unsigned short nWord) {
g_nAD9833Config &= 0xfff;
AD9833Write(g_nAD9833Config);
nWord &= 0x3fff;
nWord |= 0x8000;
AD9833Write(nWord);
}
void AD9833WriteFrequency1MSB(unsigned short nWord) {
g_nAD9833Config &= 0xfff;
g_nAD9833Config |= 0x1000;
nWord &= 0x3fff;
nWord |= 0x8000;
AD9833Write(nWord);
}
void AD9833SelectFrequency0(void) {
g_nAD9833Config &= ~AD9833_CB_FSELECT;
AD9833Write(g_nAD9833Config);
}
void AD9833SelectFrequency1(void) {
g_nAD9833Config = AD9833_CB_FSELECT;
AD9833Write(g_nAD9833Config);
}
void AD9833SelectPhase0(void) {
g_nAD9833Config &= ~AD9833_CB_PSELECT;
AD9833Write(g_nAD9833Config);
}
void AD9833SelectPhase1(void) {
g_nAD9833Config |= AD9833_CB_FSELECT;
AD9833Write(g_nAD9833Config);
}
//------------------------------------------------------------------------------
void AD9833WritePhase0(unsigned short nWord) {
nWord &= 0x0fff;
nWord |= 0xc000;
AD9833Write(nWord);
}
void AD9833WritePhase1(unsigned short nWord) {
nWord &= 0x0fff;
nWord |= 0xe000;
AD9833Write(nWord);
}
//------------------------------------------------------------------------------
void AD9833SetFrequency(double lfFrequency) {
unsigned int nf = (unsigned int)(lfFrequency / AD9833_MCLK * (0x10000000L - 1) + 0.5);
AD9833WriteFrequency0(nf);
}
void AD9833SetPhase(double lfPhase) {
unsigned int nPhase = (unsigned int)(lfPhase * 0xfff / 3.1415926 + 0.5);
AD9833WritePhase0(nPhase);
}
//==============================================================================
// END OF FILE : AD9833.C
//------------------------------------------------------------------------------
/*
**==============================================================================
** AD9833.H: -- by Dr. ZhuoQing, 2025-01-03
**
**Description:
**
**==============================================================================
*/
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//==============================================================================
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//==============================================================================
AD9833_EXT unsigned short g_nAD9833Config;
//------------------------------------------------------------------------------
void AD9833Init(void);
//------------------------------------------------------------------------------
void AD9833Write(unsigned int nWord);
void AD9833WriteFrequency0(unsigned int nWord);
void AD9833WriteFrequency1(unsigned int nWord);
void AD9833WriteFrequency0LSB(unsigned short nWord);
void AD9833WriteFrequency0MSB(unsigned short nWord);
void AD9833WriteFrequency1LSB(unsigned short nWord);
void AD9833WriteFrequency1MSB(unsigned short nWord);
void AD9833WritePhase0(unsigned short nWord);
void AD9833WritePhase1(unsigned short nWord);
void AD9833SelectFrequency0(void);
void AD9833SelectFrequency1(void);
void AD9833SelectPhase0(void);
void AD9833SelectPhase1(void);
//------------------------------------------------------------------------------
void AD9833Reset(void);
void AD9833ClearReset(void);
void AD9833SinusoidalOutput(void);
void AD9833TriangleOutput(void);
void AD9833SquareOutput(void);
void AD9833SquareOutput1(void);
//------------------------------------------------------------------------------
void AD9833SetFrequency(double lfFrequency);
void AD9833SetPhase(double lfPhase);
//==============================================================================
// END OF FILE : AD9833.H
//------------------------------------------------------------------------------
DebugLab 发表于 2025-5-2 16:20
https://so.csdn.net/so/search?q=AD9833&t=blog&u=zhuoqingjoking97298
https://blog.csdn.net/zhuoqin ...
看不出是51的代码
页:
[1]