编辑的程序无论如何也不能和 AD5313 通信。AD5313 需要16位的数据,而16F877A 只能每次发送8位。在两次发送中间的处理间隔导致数据不连续?
不胜感激!
AD5313 与 PIC 16F 877A? 通过 SPI 通信问题 #include <pic.h>
//本程序将通过PIC16F877 的SPI 方式驱动D/A 转换器MAX518A5313 通道输出
unsigned int i;
unsigned int t;
unsigned int a,b;
unsigned int y;
unsigned int j;
unsigned int n;
unsigned int discon;
unsigned int discona;
//SPI 初始化子程序
void SPIint()
{????
??????? PIR1=0;
??????? SSPCON = 0X32;???????? //0000 1000, 初始化SSPCON 寄存器,SPI主控方式,时钟Fosc/64
??????? TRISC3 =0;?????????? // RC3 为SCK 脉冲,为输出
??????? TRISC4 =1;?????????? //主控方式下,SDI 为输入
??????? TRISC5 =0;????????? //? SDO 为输出
???????
??????? SSPSTAT="0X80";???????? //初始化SSPSTAT 寄存器
???????????????
???????
??????? SSPIF="0";????????????? //清SSP 中断标志
???????? CKP="0";
???????? CKE="1";
????????
???????
?????????????????????????????
??????? SSPEN="1";????????????? //SPI 模块使能
???????
??????? TRISA5=0;???????????? //重新设定RD5的功能
??????? RA5=1;???????? // SPI 主控方式下,SS 片选端,不用应当接高电平
}
void init(void)
{
?? asm("CLRWDT");?
?? ADCON1=0X0F;
?? TRISA="0B00100000";?? //RA5 位为片选 输入端,在SPI使能之前需要设定为输入
??
?? TRISC="0B00010000";
?? TRISD="0B00000000";
??
??? PORTA="0x38";?????? // RA3、RA4、RA5 应为高电平 0011 1000
?
?? PORTC="0x00";?
?? PORTD="0x00";
???
?????????
}
void delay(unsigned long x)
{
??? unsigned int a,b;
??? for(a=x;a>0;a--);??
??? for(b=10;b>0;b--);
}
//SPI 总线输出数据子程序
void spi()
{
?????????????????? delay(100);//DA转换器 启动延时
??????????????????
????????????????
?????????????????? RA3=1;????? //清除ADC CLR端子 缓冲数据 无效
?????????????????
?????????????????? RA4=1;????? //? LDAC 数据更新禁止
??????????????????
???????????????
????????????????? RA1=1;???? //产生帧同步信号
?????????????????
????????????????? delay(10);? //保证帧同步信号高电平时间
????????????????? RA1=0;???? //产生帧同步信号
??????????????????
??????? SSPBUF="0X45"; //SPI 总线发送高位数据字节
???????????
?????????????
??????????? do {
??????????????? ;
??????????????? }while(SSPIF==0); //等待数据发送完毕
???????????????? SSPIF="0"; //SSPIF 标志清0
???????????????
???????????????? delay(3);????????
??????????
??????? SSPBUF="0X54"; //SPI 总线发送 低位数据字节
?????????????? do {
????????????????? ;
????????????????? }while(SSPIF==0); //等待数据发送完毕
???????????????????
????????????????
??????????????????? SSPIF="0"; //SSPIF 标志清0
??????????????????? n="SSPBUF";// 读SSPBUF的值,以去掉BF清零???????
???
????????? RA1=1;???? //停止帧同步信号(片选结束)
????????? RA2=1;????? //第二块D/A转换器 帧同步信号(片选结束)
????????
???????? delay(10);
???????? RA4=0;????? // 数据接收完毕,允许更新DAC
???????? delay(10);
???????? RA4=1;????? //数据更新完毕
?????????
????????????
????????
????????????? // delay(60000);
????????????
???????????? // delay(60000);
??????????? //? RD6=1;
???????????? //? delay(60000);
????????????? // delay(60000);
??????????? //? RD6=0;
}
//主程序
main ()
????????? {
????????????????? init();
???????????????????????
???????????????? SPIint(); //I2C 初始化
???????????????????
????????????? asm("CLRWDT");
?
????????????
??????????????????????????
??????????????????
??????? while(1)????????????
????????????? {?
??????????????? delay(10);
??????????????
??????????????? // RD7=0;
??????????????? spi(); //利用spi 总线方式送出数据
???????????????
??????????????? delay(10);
???????????????? RD7=1;
????????????????????????????????????
???????????? }???????? }