📄 spi_ad_2.c
字号:
// 串行AD与DSP通过SPI通信程序
#include "register.h"
int flag;
int RESULT[256];
int i;
// 系统初始化子程序
void initial()
{
asm(" setc INTM"); // 禁止所有中断
WSGR=0x0000;
asm(" clrc SXM"); // 抑制符号位扩展
asm(" clrc OVM"); // 累加器中结果正常溢出
asm(" clrc CNF"); // B0被配置为数据存储空间
*SCSR1=0x82FC; // CLKIN=15M,CLKOUT=2*CLKIN=30M
*WDCR=0x0E8; // 不使能看门狗,因为SCSR2中的WDOVERRIDE
// 即WD保护位复位后的缺省值为1,故可以用软件禁止看门狗
*IMR=0x0000; // 禁止所有中断
*IFR=0xFFFF; // 清除全部中断标志,"写1清0"
}
// SPI初始化子程序
void SPIinitial()
{
*MCRB=0x0018; // 设置通用引脚为SPI功能,SIMO和SS为通用IO
*PCDATDIR=*PCDATDIR|0x0404; // IOPC2设置为输出方式,且IOPC2=1
*SPICCR=0x0009; // 使SPI进入复位状态,0831为下降沿输出
*SPICTL=0x000C; // 禁止过冲中断、延时时钟、主工作方式、禁止中断、禁止发送
*SPIBRR=0x0063; // SPI波特率=300KHz
*SPICCR=*SPICCR|0x0080; // SPICLK信号下降沿输入数据,10位
//*PCDATDIR=*PCDATDIR&0x0FFFB; // IOPC2=0,以片选AD转换器
}
// 延时程序,等待AD
void ADCdelay(int delx)
{
int m=0;
while(m<delx)
{
m++;
}
}
// 主程序
main()
{
initial(); // 系统初始化
SPIinitial(); // SPI初始化
while(1)
{
for(i=0;i<=255;i++)
{
*PCDATDIR=*PCDATDIR&0xFFFB; // 输出一个低电平,片选AD
ADCdelay(0xF); // 延时十个时钟周期
*SPITXBUF=0x00; // 虚发一个数,触发CLK,使AD开始转换
while((*SPISTS&0x40)!=0x40){} // 判断数据是否接收完毕
*PCDATDIR=*PCDATDIR|0x0404; // 输出一个高电平,为下次数据收发做准备
ADCdelay(0xF); // 延时十个时钟周期
RESULT[i]=*SPIRXBUF&0x00FF; // 读数,将中断标志位清零
// 屏蔽高七位和最低位
}
}
}
void interrupt nothing( )
{
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -