FPGA IP軟核之Microblaze_SPI接口(AD9833)


由於要使用IP軟核Microblaze的SPI接口驅動DDS芯片AD9833,系統自帶SPI接口程序實在太亂了,使用的AX309開發板,開發板例程SPI接口是FLASH讀寫,改起來也很費勁,所以干脆自己根據Microblaze手冊編寫SPI驅動。

 

 

 

 

 

 

 程序為SPI連接兩個AD9833芯片,通過Microblaze中的SPI從設備寄存器SPISSR設置從設備。程序如下圖:

 1 #include "xspi.h"
 2 #include "xspi_l.h"
 3 #include "ad9833.h"
 4 #include "xparameters.h"
 5 #include "xgpio.h"
 6 
 7 
 8 #define  Triangle_Wave  0x0002
 9 #define  Sin_Wave       0x0000
10 #define  MSB_Wave       0x0028
11 #define  MSB_Wave_Half  0x0020
12 #define AD9833_freq_k 10.73741824f
13 
14 void ad9833_init (void)
15 {
16     XSpi_WriteReg(XPAR_SPI_0_BASEADDR, XSP_CR_OFFSET,  XSP_CR_ENABLE_MASK |XSP_CR_MASTER_MODE_MASK        |XSP_CR_CLK_POLARITY_MASK);
17      XSpi_WriteReg(XPAR_SPI_0_BASEADDR, XSP_SSR_OFFSET, 0X00000002);
18      XSpi_WriteReg(XPAR_SPI_0_BASEADDR, XSP_DTR_OFFSET, 0x0100);     //復位
19      XSpi_WriteReg(XPAR_SPI_0_BASEADDR, XSP_DTR_OFFSET, 0x2100);  //B28、RESET為1,FSELECT =0;PSELECT =0;
20      XSpi_WriteReg(XPAR_SPI_0_BASEADDR, XSP_DTR_OFFSET, 0x4000);     // 頻率寄存器低14位
21       XSpi_WriteReg(XPAR_SPI_0_BASEADDR, XSP_DTR_OFFSET, 0x4000);     //頻率寄存器高14位
22       XSpi_WriteReg(XPAR_SPI_0_BASEADDR, XSP_DTR_OFFSET, 0xC000);     //相位
23       XSpi_WriteReg(XPAR_SPI_0_BASEADDR, XSP_DTR_OFFSET, 0x2000);
24 
25      XSpi_WriteReg(XPAR_SPI_0_BASEADDR, XSP_SSR_OFFSET, 0X00000001);
26 
27      XSpi_WriteReg(XPAR_SPI_0_BASEADDR, XSP_DTR_OFFSET, 0x0100);     //復位
28      XSpi_WriteReg(XPAR_SPI_0_BASEADDR, XSP_DTR_OFFSET, 0x2100);     //B28、RESET 為1,FSELECT =0;PSELECT =0;
29      XSpi_WriteReg(XPAR_SPI_0_BASEADDR, XSP_DTR_OFFSET, 0x4000);     // 頻率寄存器低14位
30       XSpi_WriteReg(XPAR_SPI_0_BASEADDR, XSP_DTR_OFFSET, 0x4000);     //頻率寄存器高14位
31       XSpi_WriteReg(XPAR_SPI_0_BASEADDR, XSP_DTR_OFFSET, 0xC000);     //相位
32       XSpi_WriteReg(XPAR_SPI_0_BASEADDR, XSP_DTR_OFFSET, 0x2000);
33 
34 }
35 
36 void ad9833_FreqSet(u32 freq)     // HZ
37 {
38      u16 Freq_L = 0;
39      u16 Freq_H = 0;    //正弦頻率
40      float temp =0.0;
41      u32 freq_str =0;
42 
43      u16 Freq_Tri_L = 0;
44      u16 Freq_Tri_H = 0;  //觸發信號頻率
45      u32 Freq_Tri_str =0;
46      temp = freq * AD9833_freq_k;
47      freq_str =(u32)temp;
48      freq_str = freq_str << 2;
49      Freq_L = (u16)(freq_str & 0xFFFF);
50      Freq_L =      Freq_L >>2;
51      Freq_L = Freq_L & 0x3FFF;
52      Freq_L = Freq_L | 0x4000;
53 
54      Freq_H = (u16)((freq_str & 0xFFFF0000) >>16);
55      Freq_H = Freq_H & 0x3FFF;
56      Freq_H = Freq_H | 0x4000;
57 
58 ///////////////////////////////////////////////////
59      Freq_Tri_str = freq_str <<4;
60      Freq_Tri_L = (u16)(Freq_Tri_str & 0xFFFF);
61      Freq_Tri_L =      Freq_Tri_L >>2;
62      Freq_Tri_L = Freq_Tri_L & 0x3FFF;
63      Freq_Tri_L = Freq_Tri_L | 0x4000;
64 
65      Freq_Tri_H = (u16)((Freq_Tri_str & 0xFFFF0000) >>16);
66      Freq_Tri_H = Freq_Tri_H & 0x3FFF;
67      Freq_Tri_H = Freq_Tri_H | 0x4000;
68 
69      XSpi_WriteReg(XPAR_SPI_0_BASEADDR, XSP_SSR_OFFSET, 0X00000002);
70      XSpi_WriteReg(XPAR_SPI_0_BASEADDR, XSP_DTR_OFFSET, 0x2000  |Sin_Wave);     //B28、RESET 為1,FSELECT =0;PSELECT =0;
71      XSpi_WriteReg(XPAR_SPI_0_BASEADDR, XSP_DTR_OFFSET, Freq_L);                // 頻率寄存器低14位
72      XSpi_WriteReg(XPAR_SPI_0_BASEADDR, XSP_DTR_OFFSET, Freq_H);                // 頻率寄存器高14位
73      delay(1);
74      XSpi_WriteReg(XPAR_SPI_0_BASEADDR, XSP_SSR_OFFSET, 0X00000001);
75      XSpi_WriteReg(XPAR_SPI_0_BASEADDR, XSP_DTR_OFFSET, 0x2000  |MSB_Wave);     //B28、RESET 為1,FSELECT =0;PSELECT =0;
76      XSpi_WriteReg(XPAR_SPI_0_BASEADDR, XSP_DTR_OFFSET, Freq_Tri_L);                // 頻率寄存器低14位
77      XSpi_WriteReg(XPAR_SPI_0_BASEADDR, XSP_DTR_OFFSET, Freq_Tri_H);                // 頻率寄存器高14位
78 }

 



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM