神农鼎 发表于 2025-5-2 14:54:21

要 AI8051U SPI控制AD9833的程序示例

要 AI8051U SPI控制AD9833的程序示例

国芯人工智能 发表于 2025-5-2 14:58:00

关于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走线长度

[本文内容由国芯人工智能辅助生成,仅供参考]

DebugLab 发表于 2025-5-2 16:20:19



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


神农鼎 发表于 2025-5-2 16:34:54

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]
查看完整版本: 要 AI8051U SPI控制AD9833的程序示例