📄 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 + -