找回密码
 立即注册
查看: 65|回复: 3

要 AI8051U SPI控制AD9833的程序示例

[复制链接]
  • 打卡等级:常住居民I
  • 打卡总天数:62
  • 最近打卡:2025-05-09 11:19:24

719

主题

1万

回帖

1万

积分

管理员

积分
15659
发表于 2025-5-2 14:54:21 | 显示全部楼层 |阅读模式
要 AI8051U SPI控制AD9833的程序示例
回复

使用道具 举报 送花

3

主题

1102

回帖

915

积分

等待验证会员

积分
915
发表于 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)freq  268435456.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走线长度

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:431
  • 最近打卡:2025-05-09 09:00:33
已绑定手机

77

主题

4882

回帖

8516

积分

超级版主

DebugLab

积分
8516
发表于 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/

  1. /*
  2. **==============================================================================
  3. ** AD9833.C:             -- by Dr. ZhuoQing, 2025-01-03
  4. **
  5. **==============================================================================
  6. */
  7. //------------------------------------------------------------------------------
  8. //------------------------------------------------------------------------------
  9. void AD9833Init(void) {
  10.     PM_PP(AD9833_FSYNC);
  11.     ON(AD9833_FSYNC);
  12.    
  13.     PM_PP(AD9833_SCLK);
  14.     ON(AD9833_SCLK);
  15.    
  16.     PM_PP(AD9833_SDATA);
  17.     OFF(AD9833_SDATA);
  18.     //--------------------------------------------------------------------------
  19.    
  20.     g_nAD9833Config = AD9833_CONFIG_DEF;
  21.     AD9833Reset();
  22.     AD9833WriteFrequency0(AD9833_FREQUENCY_DEF);
  23.     AD9833WritePhase0(AD9833_PHASE_DEF);
  24.     AD9833WriteFrequency1(AD9833_FREQUENCY_DEF);
  25.     AD9833WritePhase1(AD9833_PHASE_DEF);
  26.     AD9833SinusoidalOutput();
  27. //    AD9833TriangleOutput();
  28. //    AD9833SquareOutput1();
  29.     AD9833ClearReset();
  30. }
  31. //------------------------------------------------------------------------------
  32. //extern SPI_HandleTypeDef hspi1;
  33. void AD9833Write(unsigned int nWord) {
  34. //    unsigned short nInt16 = (unsigned short)nWord;
  35. //    OFF(AD9833_FSYNC);
  36. //    HAL_SPI_Transmit(&hspi1, (uint8_t *)&nInt16, 1, 1);
  37. //    ON(AD9833_FSYNC);
  38.     unsigned int nMask;
  39.     unsigned char i;
  40.    
  41.     nMask = 0x8000;
  42.     OFF(AD9833_FSYNC);
  43.     for(i = 0; i < 16; i ++) {
  44.         if(nWord & nMask) ON(AD9833_SDATA);
  45.         else OFF(AD9833_SDATA);
  46.         
  47.         OFF(AD9833_SCLK);
  48.         ON(AD9833_SCLK);
  49.         
  50.         nMask >>= 1;
  51.     }
  52.     ON(AD9833_FSYNC);
  53. }
  54. //------------------------------------------------------------------------------
  55. void AD9833Reset(void) {
  56.     g_nAD9833Config |= AD9833_CB_RESET;
  57.     AD9833Write(g_nAD9833Config);
  58. }
  59. void AD9833ClearReset(void) {
  60.     g_nAD9833Config &= ~AD9833_CB_RESET;
  61.     AD9833Write(g_nAD9833Config);
  62. }
  63. void AD9833SinusoidalOutput(void) {
  64.     g_nAD9833Config &= ~(AD9833_CB_OPBITEN | AD9833_CB_MODE);
  65.     AD9833Write(g_nAD9833Config);
  66. }
  67. void AD9833TriangleOutput(void) {
  68.     g_nAD9833Config &= ~(AD9833_CB_OPBITEN);
  69.     g_nAD9833Config |= AD9833_CB_MODE;
  70.     AD9833Write(g_nAD9833Config);
  71. }
  72. void AD9833SquareOutput(void) {
  73.     g_nAD9833Config &= ~AD9833_CB_MODE;
  74.     g_nAD9833Config |= AD9833_CB_OPBITEN;
  75.     g_nAD9833Config &= ~AD9833_CB_DIV2;
  76.     AD9833Write(g_nAD9833Config);
  77. }
  78. void AD9833SquareOutput1(void) {
  79.     g_nAD9833Config &= ~AD9833_CB_MODE;
  80.     g_nAD9833Config |= AD9833_CB_OPBITEN;
  81.     g_nAD9833Config |= AD9833_CB_DIV2;
  82.     AD9833Write(g_nAD9833Config);
  83. }
  84. //------------------------------------------------------------------------------
  85. void AD9833WriteFrequency0(unsigned int nWord) {
  86.     unsigned int nWrite;
  87.    
  88.     g_nAD9833Config |= 0x2000;
  89.     AD9833Write(g_nAD9833Config);
  90.     nWrite = nWord & 0x3fff;
  91.     nWrite |= 0x4000;
  92.     AD9833Write(nWrite);
  93.     nWrite = (nWord >> 14) & 0x3fff;
  94.     nWrite |= 0x4000;
  95.     AD9833Write(nWrite);
  96.     g_nAD9833Config &= ~0x2000;
  97.     AD9833Write(g_nAD9833Config);
  98. }
  99. void AD9833WriteFrequency1(unsigned int nWord) {
  100.     unsigned int nWrite;
  101.    
  102.     g_nAD9833Config |= 0x2000;
  103.     AD9833Write(g_nAD9833Config);
  104.     nWrite = nWord & 0x3fff;
  105.     nWrite |= 0x8000;
  106.     AD9833Write(nWrite);
  107.     nWrite = (nWord >> 14) & 0x3fff;
  108.     nWrite |= 0x8000;
  109.     AD9833Write(nWrite);
  110.     g_nAD9833Config &= ~0x2000;
  111.     AD9833Write(g_nAD9833Config);
  112. }
  113. //------------------------------------------------------------------------------
  114. void AD9833WriteFrequency0LSB(unsigned short nWord) {
  115.     g_nAD9833Config &= 0xfff;
  116.     AD9833Write(g_nAD9833Config);
  117. //    AD9833Write(0x1000);
  118.     nWord &= 0x3fff;
  119.     nWord |= 0x4000;
  120.     AD9833Write(nWord);
  121. }
  122. void AD9833WriteFrequency0MSB(unsigned short nWord) {
  123.     g_nAD9833Config &= 0xfff;
  124.     g_nAD9833Config |= 0x1000;
  125.     AD9833Write(g_nAD9833Config);
  126.     nWord &= 0x3fff;
  127.     nWord |= 0x4000;
  128.     AD9833Write(nWord);
  129. }
  130. void AD9833WriteFrequency1LSB(unsigned short nWord) {
  131.     g_nAD9833Config &= 0xfff;
  132.     AD9833Write(g_nAD9833Config);
  133.     nWord &= 0x3fff;
  134.     nWord |= 0x8000;
  135.     AD9833Write(nWord);
  136. }
  137. void AD9833WriteFrequency1MSB(unsigned short nWord) {
  138.     g_nAD9833Config &= 0xfff;
  139.     g_nAD9833Config |= 0x1000;
  140.     nWord &= 0x3fff;
  141.     nWord |= 0x8000;
  142.     AD9833Write(nWord);
  143. }
  144. void AD9833SelectFrequency0(void) {
  145.     g_nAD9833Config &= ~AD9833_CB_FSELECT;
  146.     AD9833Write(g_nAD9833Config);
  147. }
  148. void AD9833SelectFrequency1(void) {
  149.     g_nAD9833Config = AD9833_CB_FSELECT;
  150.     AD9833Write(g_nAD9833Config);
  151. }
  152. void AD9833SelectPhase0(void) {
  153.     g_nAD9833Config &= ~AD9833_CB_PSELECT;
  154.     AD9833Write(g_nAD9833Config);
  155. }
  156. void AD9833SelectPhase1(void) {
  157.     g_nAD9833Config |= AD9833_CB_FSELECT;
  158.     AD9833Write(g_nAD9833Config);
  159. }
  160. //------------------------------------------------------------------------------
  161. void AD9833WritePhase0(unsigned short nWord) {
  162.     nWord &= 0x0fff;
  163.     nWord |= 0xc000;
  164.     AD9833Write(nWord);
  165. }
  166. void AD9833WritePhase1(unsigned short nWord) {
  167.     nWord &= 0x0fff;
  168.     nWord |= 0xe000;
  169.     AD9833Write(nWord);
  170. }
  171. //------------------------------------------------------------------------------
  172. void AD9833SetFrequency(double lfFrequency) {
  173.     unsigned int nf = (unsigned int)(lfFrequency / AD9833_MCLK * (0x10000000L - 1) + 0.5);
  174.     AD9833WriteFrequency0(nf);
  175. }
  176. void AD9833SetPhase(double lfPhase) {
  177.     unsigned int nPhase = (unsigned int)(lfPhase * 0xfff / 3.1415926 + 0.5);
  178.     AD9833WritePhase0(nPhase);
  179. }
  180. //==============================================================================
  181. //                END OF FILE : AD9833.C
  182. //------------------------------------------------------------------------------
复制代码
  1. /*
  2. **==============================================================================
  3. ** AD9833.H:            -- by Dr. ZhuoQing, 2025-01-03
  4. **
  5. **  Description:
  6. **
  7. **==============================================================================
  8. */
  9. //------------------------------------------------------------------------------
  10. //------------------------------------------------------------------------------
  11. //==============================================================================
  12. //------------------------------------------------------------------------------
  13. //------------------------------------------------------------------------------
  14. //==============================================================================
  15. AD9833_EXT unsigned short g_nAD9833Config;
  16. //------------------------------------------------------------------------------
  17. void AD9833Init(void);
  18. //------------------------------------------------------------------------------
  19. void AD9833Write(unsigned int nWord);
  20. void AD9833WriteFrequency0(unsigned int nWord);
  21. void AD9833WriteFrequency1(unsigned int nWord);
  22. void AD9833WriteFrequency0LSB(unsigned short nWord);
  23. void AD9833WriteFrequency0MSB(unsigned short nWord);
  24. void AD9833WriteFrequency1LSB(unsigned short nWord);
  25. void AD9833WriteFrequency1MSB(unsigned short nWord);
  26. void AD9833WritePhase0(unsigned short nWord);
  27. void AD9833WritePhase1(unsigned short nWord);
  28. void AD9833SelectFrequency0(void);
  29. void AD9833SelectFrequency1(void);
  30. void AD9833SelectPhase0(void);
  31. void AD9833SelectPhase1(void);
  32. //------------------------------------------------------------------------------
  33. void AD9833Reset(void);
  34. void AD9833ClearReset(void);
  35. void AD9833SinusoidalOutput(void);
  36. void AD9833TriangleOutput(void);
  37. void AD9833SquareOutput(void);
  38. void AD9833SquareOutput1(void);
  39. //------------------------------------------------------------------------------
  40. void AD9833SetFrequency(double lfFrequency);
  41. void AD9833SetPhase(double lfPhase);
  42. //==============================================================================
  43. //             END OF FILE : AD9833.H
  44. //------------------------------------------------------------------------------
复制代码


点评

看不出是51的代码  详情 回复 发表于 2025-5-2 16:34
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:62
  • 最近打卡:2025-05-09 11:19:24

719

主题

1万

回帖

1万

积分

管理员

积分
15659
发表于 2025-5-2 16:34:54 | 显示全部楼层
Debu*** 发表于 2025-5-2 16:20
https://so.csdn.net/so/search?q=AD9833&t=blog&u=zhuoqingjoking97298

https://blog.csdn.net/zhuoqin ...

看不出是51的代码
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-10 04:22 , Processed in 0.133820 second(s), 70 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表