这是我写的dsPIC30F6015控制AD7715程序,亲测可用
单片机源程序如下:
#include
_FOSC(CSW_FSCM_OFF & XT_PLL4);
_FWDT(WDT_OFF);
#define uchar unsigned char
#define uint unsigned int
#define CS_A LATCbits.LATC13 //RC13输出
#define DRDY PORTDbits.RD10 //RD10输入
uint result;
void delay_ms(uint x) //延时程序 10M晶振 0.1us
{
uint a,b;
for(a=x;a>0;a--)
for(b=2500;b>0;b--);
}
void Init_PORT(void)
{
// TRISFbits.TRISF4 =0; //报警信号输出
//U2MODEbits.UARTEN=0; //禁止串口
TRISGbits.TRISG6=0; // SCK
TRISGbits.TRISG7=1; // SDI
TRISGbits.TRISG8=0; // SDO
TRISDbits.TRISD10=1;// DRDY
TRISCbits.TRISC13=0;// CS_A
}
//--------------------------------------------------------------------------------------------------
// 函数名称: Init_SPI2()
// 函数功能: 初始化设置SPI2
// 入口参数: 无
// 返回值:无
//--------------------------------------------------------------------------------------------------
void Init_SPI2()
{
SPI2BUF=0; //数据寄存器清0
IFS1bits.SPI2IF=0;//清中断标志
IEC1bits.SPI2IE=0;//关闭中断
IPC6bits.SPI2IP=2;//中断优先级为2
SPI2STATbits.SPIEN=0; //禁止SPI2
SPI2CONbits.PPRE = 1;//主分频比16:1
SPI2CONbits.SPRE = 4;//预分频比4:1 SCk=10M/(16*4)
SPI2CONbits.FRMEN = 0; //禁止帧SPI支持
SPI2CONbits.DISSDO = 0; //使用SDO2引脚
SPI2CONbits.MODE16 = 0; //8位通讯
SPI2CONbits.SMP = 0; //中间采样输入数据
SPI2CONbits.CKE = 0; //由空闲转为工作状态时输出数据
SPI2CONbits.CKP = 1; //空闲状态为高电平
SPI2CONbits.MSTEN = 1; //主模式
SPI2CONbits.SSEN = 0; //不使用SS2引脚
SPI2STATbits.SPISIDL = 0; //空闲模式下继续工作
SPI2STATbits.SPIROV = 0; //未溢出
SPI2STATbits.SPIEN = 1; //使能SPI2
}
void Init_Uart2()
{
U2BRG=10;// set baudrate 56000BPS
U2MODE =0x8000 ;//8位数据、无校验、一个停止位
IEC1bits.U2RXIE = 1;
IPC6bits.U2RXIP = 5;// UART1接收器中断优先级位
IFS1bits.U2RXIF=0;
IEC1bits.U2TXIE = 0;
IPC6bits.U2TXIP = 6;
U2STAbits.UTXISEL = 0;
U2STAbits.UTXBRK = 0;
U2STAbits.UTXBF = 0;
U2STAbits.URXISEL = 0;
U2STAbits.ADDEN = 0;
U2STAbits.UTXEN = 1;
}
/************************************************************
* 函数名称:UART2_Send()
* 串口2发送子函数
************************************************************/
void UART2_Send(unsigned char data)
{
U2TXREG=data;
while(IFS1bits.U2TXIF==0);
IFS1bits.U2TXIF=0;
}
//--------------------------------------------------------------------------------------------------
// 函数名称: AD_write()
// 入口参数: commuCFG通讯寄存器控制字
// 出口参数: 无
// 函数功能: 写AD7715
//--------------------------------------------------------------------------------------------------
void AD_write(unsigned char data)
{
unsigned char temp;
CS_A=0;
Nop();
SPI2BUF=data;
while(IFS1bits.SPI2IF==0);
IFS1bits.SPI2IF=0;
temp=SPI2BUF;
CS_A=1;
Nop();
}
uint read_from_ad7715()//读AD7715 二个字节
{
uchar read_h,read_l;
uint AD;
while(DRDY);
CS_A=0;
Nop();
SPI2BUF=0xff;
while(IFS1bits.SPI2IF==0);
IFS1bits.SPI2IF=0;
read_h=SPI2BUF;
Nop();
SPI2BUF=0xff;
while(IFS1bits.SPI2IF==0);
IFS1bits.SPI2IF=0;
read_l=SPI2BUF;
AD=(read_h<<8)+read_l ;
CS_A=1;
return (AD);
}
int main(void)
{
Power_Management();
Init_PORT();
Init_SPI2();
Init_Uart2();
AD_write(0x10); //设定寄存器,写模式 增益为1
AD_write(0x6C); //设置SetReg,单端,60hz 自校验方式 时钟2.4576MHz 输入不加缓冲
while(1)
{
while(DRDY); //等待AD7715提供可读的数据
AD_write(0x38);
Nop();
result=read_from_ad7715();
UART2_Send(result>>8);
……………………
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』