?? spi+da.c
字號:
//該程序利用LF2407的SPI模塊向MAX5741芯片發送數據用于D/A轉換,MAX5741的模擬輸出端A輸出一個三角波
#include "register.h"
int GPR3;
int flag1;
int flag;
//系統初始化子程序
void initial()
{
asm(" setc INTM"); //屏蔽中斷
WSGR=0x00; //禁止所有的等待狀態
asm(" CLRC SXM");
asm(" CLRC OVM");
asm(" CLRC CNF"); //B0被配置為數據空間
SCSR1=0x81FE; //CLKIN=6M,CLKOUT=24M ,并且使能到SPI模塊的時鐘
WDCR=0x0E8; //不使能看門狗
IMR=0x0000; // 禁止所有中斷
IFR=0x0FFFF; // 清除全部中斷標志,"寫1清0"
}
//SPI模塊初始化子程序
void SPIINITIAL()
{
SPICCR=0x0047; //8 char bits ,在SPICLK的下降沿發送數據,8位數
SPICTL=0x0006; //使能主動模式,一般的時鐘方式,使能TALK
SPIBRR=0x000b; //SPI的波特率為6M,CLKOUT=24M
MCRB=0x0014; //設置通用引腳為SPI功能的引腳 ,且IOPC3為一般I/O口
SPICCR=SPICCR|0x0080; //使SPI退出復位狀態
}
//SPI發送數據子程序,需要發送的數據存放在GPR3寄存器中
int SPITRANS(unsigned int GPR3)
{
PCDATDIR=(PCDATDIR|0x0800)&0x0FFF7;//設置IOPC3為輸出,且輸出低電平,
//以選中MAX5741芯片
SPITXBUF=GPR3; //向SPI的發送緩沖器寫一個發送數據
while(1)
{
flag=SPISTS&0x40; //flag=SPI的中斷標志
if(flag==0x40) break; //如果SPI的中斷標志的中斷標志為1,則證
//明SPI已經發送成功,則停止等待
}
SPIRXBUF=SPIRXBUF; //虛讀SPIRXBUF寄存器,以清除SPI中斷標志
PCDATDIR=PCDATDIR|0x08; //發送完畢,則IOPC3輸出高,使發送的數據輸
//出到MAX5741的輸入寄存器和DAC寄存器中
}
main() //主程序
{
initial(); //系統初始化
SPIINITIAL(); //SPI初始化
GPR3=0x0000; //根據MAX5741的格式寫一個數據,使其輸出的模擬量為0
flag1=0x00; //三角波上升沿、下降沿標志,當flag1=0時,為上
//升沿,當flag1=1時,為下降沿
SPITRANS(0x0f000); //喚醒DAC OUTA
asm (" rpt 165 ");
asm (" nop ");
while(1)
{
if(flag1==0x00) GPR3=GPR3+4; //因為數據從倒數第4位開始,故要使數據加1,則
//需要在實際的寄存器中加4,此操作對應三角波的上升沿
else GPR3=GPR3-4; //因為數據從倒數第4位開始,故要使數據減1,則
//需要在實際的寄存器中減4,此操作對應三角波的下降沿
if(GPR3==0x0FFc) flag1=0x01; //若需要轉換的數據到FFFH,則開始下降沿
if(GPR3==0x0000) flag1=0x00; //若需要轉換的數據到00H,則開始上升沿
SPITRANS(GPR3); //調用SPI發送數據子程序
} //DAC OUTA上輸出一個三角波
}
//當發生干擾中斷時,執行此中斷服務程序
void interrupt nothing()
{
return;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -