⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 10.1.c

📁 dsp 通过GPIOB 对8980的控制。改进版
💻 C
字号:
/****************************************************************
**描述:利用GP定时器1在GPIOF8引脚上产生方波,令一个贴片LED闪烁**
**系统时钟150M,高速外设时钟25M,128分频后定时器周期为5.12us****
****************************************************************/
#include "DSP28_Device.h"

#define strb GpioDataRegs.GPBDAT.bit.GPIOB10
#define ad0 GpioDataRegs.GPBDAT.bit.GPIOB12
#define ad1 GpioDataRegs.GPBDAT.bit.GPIOB13
#define ad2 GpioDataRegs.GPBDAT.bit.GPIOB14
#define rw GpioDataRegs.GPBDAT.bit.GPIOB11

#define RDY GpioDataRegs.GPADAT.bit.GPIOA1

unsigned int kk1,kk2,kk3,kk4,i;
unsigned int reg_8980[8]={0,0,0,0,0,0,0,0};
unsigned int tdo_8980[4]={0,0,0,0},counter_8980[4]={0,0,0,0};
unsigned int tdi_8980[10]={0,0,0,0,0,0,0,0,0,0};
unsigned int IntNum,BF,Key_Data,KeyV; //XINT1中使用的变量
unsigned int key_code,Key_UP,key_index;                //Decode()中使用的变量
unsigned int UnShifted[18][2] = {
        0x70, '0', //
        0x69, '1',
        0x72, '2',
        0x7A, '3',
        0x6B, '4',
        0x73, '5',
        0x74, '6',
        0x6C, '7',
        0x75, '8',
        0x7D, '9',
        0x5a,'E', //Enter
        0x66,'B', //Bksp
        0x71, '.',
        0x79, '.',};


interrupt void X_INT1_isr(void);
void Decode(unsigned int);
interrupt void eva_timer1_isr(void);
void IC8980_set();
void readall_8980();
void check_RDY();
void read_status();
void DELAY_MY(unsigned int);


void 	EVA_Timer1()
{
    EvaRegs.GPTCONA.all = 0;         // 初始化 EVA Timer 1
    EvaRegs.T1PR = 0x1;           // 定时周期为5.12us*(T1PR+1)=10us
    EvaRegs.EVAIMRA.bit.T1PINT = 1;  //使能定时器1的周期中断
    EvaRegs.EVAIFRA.bit.T1PINT = 1;   //写1清除定时器1的周期中断标志
    EvaRegs.T1CNT = 0x0000;
    EvaRegs.T1CON.all = 0x1040;       //连续增计数,不分频,打开定时器 0001 0000 0100 0000
}
void write_8980(int k)
{
	int k1;

	EALLOW;	
	GpioMuxRegs.GPBMUX.all=0x00;     //把GPIOB设置为一般I/O口,输出
	GpioMuxRegs.GPBDIR.all=0xFFFF;            //输出
	EDIS;	

	k1=(GpioDataRegs.GPBDAT.all & 0xff00)|(k&0x00ff);
	GpioDataRegs.GPBDAT.all=k1;
}

int read_8980(void)

{
	int k1;

	EALLOW;	
	GpioMuxRegs.GPBMUX.all=0x00;     //把GPIOB设置为一般I/O口,输出
	GpioMuxRegs.GPBDIR.all=0xFF00;            //输入
	EDIS;	

	k1=(GpioDataRegs.GPBDAT.all & 0x00ff);
	return k1;
}







void main(void)
{
	InitSysCtrl();      //初始化系统控制寄存器, 时钟频率50M
	EALLOW;				
	SysCtrlRegs.HISPCP.all = 0x0003;//高速时钟的工作频率=25M
	EDIS;
	DINT;	        //关闭总中断,清除中断标志
	IER = 0x0000;    //关闭外围中断
	IFR = 0x0000;    	//清中断标志
	InitPieCtrl();		//初始化PIE控制寄存器
	InitPieVectTable();		
	EVA_Timer1();
	
	IntNum=BF=Key_Data=KeyV=0; //XINT1中使用的变量
	key_code=Key_UP=key_index=0;
	
	
	EALLOW;	
	XIntruptRegs.XINT1CR.bit.POLARITY=0;
	XIntruptRegs.XINT1CR.bit.ENABLE=0x1;         //使能XINT1中断
	
	GpioMuxRegs.GPDMUX.bit.T1CTRIP_PDPA_GPIOD0=0; //把GPIOD0设置为一般I/O口,输出
	GpioMuxRegs.GPDDIR.bit.GPIOD0=1;            //输出
	
	GpioMuxRegs.GPDMUX.bit.T2CTRIP_SOCA_GPIOD1=0; //把GPIOD1设置为一般I/O口,输出
	GpioMuxRegs.GPDDIR.bit.GPIOD1=1;            //输出
	
	GpioMuxRegs.GPAMUX.bit.T2PWM_GPIOA7=0;   //IO
	GpioMuxRegs.GPADIR.bit.GPIOA7=0;      //输入
	
	///////时钟输出
	GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA0=0; //IO  A0
	GpioMuxRegs.GPADIR.bit.GPIOA0=1;      //A0  输出
	
	GpioMuxRegs.GPAMUX.bit.PWM2_GPIOA1=0;   //IOA1  8980 RAELY信号
	GpioMuxRegs.GPADIR.bit.GPIOA1=0;     //输入
	
	GpioMuxRegs.GPBMUX.all=0;   //IO
	GpioMuxRegs.GPBDIR.all=0xffff;     //输出
	
	GpioDataRegs.GPBDAT.bit.GPIOB15=1;  //禁止输出
	GpioDataRegs.GPBDAT.bit.GPIOB8=0;
	GpioDataRegs.GPBDAT.bit.GPIOB8=0;
	GpioDataRegs.GPBDAT.bit.GPIOB8=1; //复位
				
	PieVectTable.XINT1= &X_INT1_isr;     //中断服务程序入口地址放入中断向量表
	PieVectTable.T1PINT = &eva_timer1_isr;     //中断服务程序入口地址放入中断向量表
		
	EDIS;
	              
	//依次使能各级中断:外设中相应中断位->PIE控制器->CPU
	PieCtrlRegs.PIEIER1.bit.INTx4=1;    //XINT1使能位于PIE第1组第4个,将其使能
	
	IER|= M_INT1;            //PIE第1组对应于CPU的可屏蔽中断1(INT1),将其使能
			
	PieCtrlRegs.PIEIER2.all = M_INT4;   //GP定时器1使能位于PIE第2组第4个,将其使能
	IER |= M_INT2;            //PIE第2组对应于CPU的可屏蔽中断2(INT2),将其使能
	EINT;   //开总中断
	
	IC8980_set();
	//GpioDataRegs.GPBDAT.bit.GPIOB15=0;  // TOE 输出使能
	
	
	while(1)
	{ 	
	//strb=1;
	//check_RYD();
	//ad0=0; ad1=0; ad2=1;  //写TDO
	//rw=0; 
	//strb=0; //strb:闸门信号
	//write_8980(0xf0);  //设置8980, 
	//strb=1;
	
	
	if(BF == 1) 
		{
		if(KeyV==105)
		{
			GpioDataRegs.GPDDAT.bit.GPIOD0=GpioDataRegs.GPDDAT.bit.GPIOD0^1; 
			KeyV=0;
		} 
		if(KeyV==114)
		{
			GpioDataRegs.GPDDAT.bit.GPIOD1=GpioDataRegs.GPDDAT.bit.GPIOD1^1; 
			KeyV=0;
		} 
		BF =0;
		} //if(BF == 1)
	
	} //	while(1)
} 	


interrupt void X_INT1_isr(void)
{  
	//GpioDataRegs.GPDDAT.bit.GPIOD0=GpioDataRegs.GPDDAT.bit.GPIOD0^1;  //产生方波
	Key_Data=GpioDataRegs.GPADAT.bit.GPIOA7;
		if ((IntNum >=1) && (IntNum <=8))
        {
         
				KeyV = KeyV >> 1;//因键盘数据是低>>高,结合上一句所以右移一位
                if (Key_Data) KeyV = KeyV | 0x8000;//当键盘数据线为1时为1到最高位
        }
        IntNum=IntNum+1;
        //while (!Key_CLK);//等待PS/2CLK拉高
        
        if (IntNum >= 11)
        {
                
                IntNum = 0;//当中断10次后表示一帧数据收完,清变量准备下一次接收
                BF = 1;//标识有字符输入完了
                KeyV= KeyV >> 8;
                //EA = 0;//关中断等显示完后再开中断 (注:如这里不用BF和关中断直接调Decode()则所Decode中所调用的所有函数要声明为再入函数)
        }

	PieCtrlRegs. PIEACK.all = 0x0001;  //清零 PIEACK中的第1组中断对应位,PIEACK_GROUP1=1                                       
}

interrupt void eva_timer1_isr(void)
{  
	GpioDataRegs.GPADAT.bit.GPIOA0=GpioDataRegs.GPADAT.bit.GPIOA0^1;    //产生方波
	EvaRegs.EVAIMRA.bit.T1PINT = 1;	         //使能定时器1的周期中断
    EvaRegs.EVAIFRA.bit.T1PINT = 1;		     //写1清除定时器1的周期中断标志
	PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;  //清零 PIEACK中的第2组中断对应位                                       
}

void Decode(unsigned int ScanCode) //判断断码
{
        unsigned int TempCyc;
        
        if (!Key_UP)//当键盘松开时
        {
                
                switch (ScanCode)
                {
                        case 0xF0 :// 当收到0xF0,Key_UP置1表示断码开始
                        Key_UP = 1; 
                        break;
                        
                        default:
                        for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++);//查表 
                        if (UnShifted[TempCyc][0] == ScanCode) {key_code=UnShifted[TempCyc][1]; key_index=1;} //返回,
 
                                                 //显示 
                        break;
                }  //switch (ScanCode)
        } //if (!Key_UP)//当键盘松开时
        else
        {
            Key_UP = 0;
                
        }
        BF = 0;  //标识字符处理完了
}


void IC8980_set()
{
	EALLOW;	
		
	GpioMuxRegs.GPBMUX.all=0x00;     //把GPIOB设置为一般I/O口,输出
	GpioMuxRegs.GPBDIR.all=0xFFFF;            //输出
	EDIS;	
	
	check_RDY();
	strb=1;
	//check_RYD();
	ad2=0; ad1=0;ad0=0;  //写config_A
	rw=0; 
	strb=0;            //strb:闸门信号
	write_8980(0x01);  //设置8980, 
	strb=1;
	
	check_RDY();
	ad2=0; ad1=0;ad0=1;   //写config_B
	rw=0; 
	strb=0;
	write_8980(0x80);    //clk=clkin 而默认为0x80
	strb=1;
	
	//counter
	check_RDY();
	ad2=1; ad1=1; ad0=0;   
	rw=0;
    strb=0;
    write_8980(24);   //least
    strb=1;
    
    check_RDY();
    strb=0;    
    write_8980(0x00);   
    strb=1;
    
    check_RDY();
    strb=0;    
    write_8980(0x00);   
    strb=1;
    
    check_RDY();
    strb=0;    
    write_8980(0x00);   //
    strb=1;
	
	GpioDataRegs.GPBDAT.bit.GPIOB15=0;
    
    check_RDY();    
	strb=1; //command
    ad2=0; ad1=1; ad0=1;
    rw=0;
    strb=0;
    write_8980(0x09);   //
    strb=1;
    
    check_RDY();
    read_status();  if((reg_8980[2] & 0x40) !=0){DELAY_MY(40000);}
    //TDO
	ad2=1; ad1=0;  ad0=0; 
	rw=0;
	strb=0;
	strb=0;
    write_8980(0x02);   //ff
    strb=1;
    strb=1;
    
    check_RDY(); 
    read_status();  if((reg_8980[2] & 0x40) !=0){DELAY_MY(40000);}
	ad2=1; ad1=0;  ad0=0; 
	rw=0;
	strb=0;
	write_8980(0xbb);   //bb
	strb=1;
    
    
    check_RDY();    
    read_status();  if((reg_8980[2] & 0x40) !=0){DELAY_MY(40000);}
    ad2=1; ad1=0;  ad0=0; 
	rw=0;
    strb=0;
    write_8980(0xcc);   //cc
    strb=1;
        
	check_RDY();
	read_status();  if((reg_8980[2] & 0x40) !=0){DELAY_MY(40000);}
	ad2=1; ad1=0;  ad0=0; 
	rw=0;
	strb=0;
	write_8980(0xff);   //aa
	strb=1;
    	
    
    for(i=0;i<40000;i++)
   {
	  strb=1;strb=1;strb=1;strb=1;
	  strb=1;strb=1;strb=1;strb=1;
	  strb=1;strb=1;strb=1;strb=1;
	  strb=1;strb=1;strb=1;strb=1;
	  strb=1;strb=1;strb=1;strb=1;
	  strb=1;strb=1;strb=1;strb=1;
	  strb=1;strb=1;strb=1;strb=1;
	  strb=1;strb=1;strb=1;strb=1;
	  strb=1;strb=1;strb=1;strb=1;
	  strb=1;strb=1;strb=1;strb=1;
	  strb=1;strb=1;strb=1;strb=1;
	  strb=1;strb=1;strb=1;strb=1;
	}
		
/////////////读 tdi 调试时使用
    EALLOW;	
	GpioMuxRegs.GPBMUX.all=0x00; 
	GpioMuxRegs.GPBDIR.all=0xFF00;            
	EDIS;
	
	check_RDY();
	ad2=0; ad1=1; ad0=0; //status
	rw=1; 
    strb=0;	
    reg_8980[2]=read_8980();
    strb=1;
    if((reg_8980[2] & 0x80)==0x80)
    {
    check_RDY();
    ad2=1; ad1=0; ad0=1; //tdi
    strb=0;	
    tdi_8980[0]=read_8980();
    strb=1;}
    
    check_RDY();
    ad2=0; ad1=1; ad0=0; //status
	rw=1; 
    strb=0;	
    reg_8980[2]=read_8980();
    strb=1;
    if((reg_8980[2] & 0x80)==0x80)
    {
    check_RDY();
    ad2=1; ad1=0; ad0=1; //tdi
    strb=0;	
    tdi_8980[1]=read_8980();
    strb=1;}
    
    check_RDY();
    ad2=0; ad1=1; ad0=0; //status
	rw=1; 
    strb=0;	
    reg_8980[2]=read_8980();
    strb=1;
    if((reg_8980[2] & 0x80)==0x80)
    {
    check_RDY();
    ad2=1; ad1=0; ad0=1; //tdi
    strb=0;	
    tdi_8980[2]=read_8980();
    strb=1;}
    
    check_RDY();
    strb=0;	
    reg_8980[2]=read_8980();
    strb=1;
    
    if((reg_8980[2] & 0x80)==0x80)
    {
    check_RDY();
    ad2=1; ad1=0; ad0=1; //tdi
    strb=0;	
    tdi_8980[3]=read_8980();
    strb=1;}
    
    check_RDY();
    ad2=0; ad1=1; ad0=0; //status
	rw=1; 
    strb=0;	
    reg_8980[2]=read_8980();
    strb=1;
    if((reg_8980[2] & 0x80)==0x80)
    {
    check_RDY();
    ad2=1; ad1=0; ad0=1; //tdi
    strb=0;	
    tdi_8980[4]=read_8980();
    strb=1;}
    
    check_RDY();
    ad2=0; ad1=1; ad0=0; //status
	rw=1; 
    strb=0;	
    reg_8980[2]=read_8980();
    strb=1;
    if((reg_8980[2] & 0x80)==0x80)
    {
    check_RDY();
    ad2=1; ad1=0; ad0=1; //tdi
    strb=0;	
    tdi_8980[5]=read_8980();
    strb=1;}
    
    //strb=0;	
    //reg_8980[5]=read_8980();
    //strb=1;
    
    strb=1;
	
  readall_8980();
  	
  
    strb=1;
    
    for(i=0;i<40000;i++)
   {
	  strb=1;
	}
	readall_8980();
	strb=1;
	
    
}


void readall_8980()
{
	EALLOW;	
	GpioMuxRegs.GPBMUX.all=0x00; 
	GpioMuxRegs.GPBDIR.all=0xFF00;            
	EDIS;
	
    check_RDY();		
	ad2=0; ad1=0; ad0=0; //A
	rw=1; 
    strb=0;	
    reg_8980[0]=read_8980();
    strb=1; 
    
    check_RDY();
	ad2=0; ad1=0; ad0=1; //B
	rw=1; 
    strb=0;	
    reg_8980[1]=read_8980();
    strb=1;
    
    check_RDY();
    ad2=0; ad1=1; ad0=0; //status
	rw=1; 
    strb=0;	
    reg_8980[2]=read_8980();
    strb=1;
    
    check_RDY();
    ad2=0; ad1=1; ad0=1; //command
	rw=1; 
    strb=0;	
    reg_8980[3]=read_8980();
    strb=1;
        
    check_RDY();
    ad2=1; ad1=1; ad0=1; //discrete control
	rw=1; 
    strb=0;	
    reg_8980[7]=read_8980();
    strb=1;
    
    //读tdo
    check_RDY();
    ad2=1; ad1=0; ad0=0; //tdo
	rw=1; 
    strb=0;	
    tdo_8980[0]=read_8980();
    strb=1; 
    
    
    //读counter
    check_RDY();
    ad2=1; ad1=1; ad0=0; //counter
	rw=1; 
    strb=0;	
    counter_8980[0]=read_8980();
    strb=1; 
    
    check_RDY();
    strb=0;	
    counter_8980[1]=read_8980();
    strb=1; 
    
    check_RDY();
    strb=0;	
    counter_8980[2]=read_8980();
    strb=1; 
    
    check_RDY();
    strb=0;	
    counter_8980[3]=read_8980();
    strb=1; 
    
    //变为输出变量    
    EALLOW;	
	GpioMuxRegs.GPBMUX.all=0x00; 
	GpioMuxRegs.GPBDIR.all=0xFFFF;            
	EDIS;
    
}


void check_RDY()
{
	unsigned int temp1;
	temp1=RDY;
	while(temp1!=1){temp1=RDY;}
}

void read_status()
{
unsigned int temp_r;
	
	temp_r=GpioMuxRegs.GPBDIR.all;
	EALLOW;	
	GpioMuxRegs.GPBDIR.all=0xFF00;            
	EDIS;
	
	check_RDY();
	ad2=0; ad1=1; ad0=0; //status
	rw=1; 
    strb=0;	
    reg_8980[2]=read_8980();
    strb=1;

	EALLOW;	
	GpioMuxRegs.GPBDIR.all=temp_r;            
	EDIS;
	
}

void DELAY_MY(unsigned int kk)
{
	unsigned int ii;
	for(ii=0;ii<kk;ii++)
   	{
		strb=1;
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -