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

📄 sub.c

📁 本程序是mc145572U接口驱动程序,有一些问题,希望大家指点.
💻 C
字号:
#define   SUB //定义子函数

#include "reg51.h"
#include "intrins.h"
#include "absacc.h"
#include "io.h"//AT89C2051的IO定义
#include "spi.h"//将SPI子函数定义为外部函数
#include "sub.h"//激活子函数定义为外部函数
#include "ch.h"//通道子函数定义为外部函数

/*********软件复位函数**********/

 void reset()//软件复位,NR0地址0-000,数据1000
  {
   _nop_();
 writedata(0X08,8);//0-000-1000 复位
  delayus(100);    //大于6个时钟周期
 writedata(0x00,8);//0-000-0000 复位后恢复正常
   }

/********选择NT AUTO-eoc初始化**********/

 void NT_initial()
   {
    _nop_();
	writedata(0x70,8);//M4 Channel transmit BR0地址0111-0000
	_nop_();
	writedata(0x77,8);//BR0数据77
	_nop_();
	writedata(0x71,8);//M4 Channel receive BR1先写入地址0111-0001
  	_nop_();
	writedata(0x7F,8);//如果是NT写入数据7F-01111111
	_nop_();
	writedata(0x72,8);//M5/M6 channel BR2先写入地址0111-0010
  	_nop_();
	writedata(0xF0,8);//如果是NT写入数据F0-11110000
  	_nop_();
	writedata(0x79,8);//EOC/M4/M5/M6 channel control BR9先写入地址0111-1001
  	_nop_();
	writedata(0x1C,8);//如果是NT写入数据1C-00011100//automatic eoc mode->00----non auto eoc->10
 	_nop_();
	writedata(0x7A,8);//BR10先写入地址0111-1010  
  	_nop_();
	writedata(0x01,8);//写入数据01-00000001 选择overlay reg有效
	_nop_();
	writedata(0x01,8);//OR7(bo)置1,M4通道模式
	_nop_();
	writedata(0x7A,8);//BR10先写入地址0111-1010
  	_nop_();
	writedata(0x00,8);//bo为0 选择overlay reg无效
	_nop_();
	writedata(0x4A,8);//NR4中断使能1010,IRQ1,IRQ3使能
	delayms(50);
	}

	
/*******选择NT AUTO-eco中断处理*********/


unsigned char NT_interrupt()
{
 unsigned char dat,val;
 if(dat&0x38==0x38)//NR3(b3) = 1
  {
  //Test for successful initial activation
    if((dat&0x1a==0x1a)||(dat&0x1b==0x1b))//IF NR1 = A or B AND  initial activation
	{
	 writedata(0x74,8);//BR4 address
	_nop_(); 	 
	writedata(0x00,8);//write BR4-00
	_nop_();	 
	 writedata(0x75,8);//BR5 address
	_nop_();	 
	writedata(0x00,8);//write BR5-00
	 	_nop_();
	if(dat&0x02==0x02)   //IF S/T interface is active- M4的b1位:sai为1 for S/T activity
 	  {
		writedata(0x70,8);//BR0地址0111-0000
		_nop_();
		writedata(0xf7,8);//BR0数据f7
		_nop_();
	   }
	 }
   else if(dat&0x14==0x14) //NR1 = 0100
     {
	 //disable interrupts activation unsuccessfull
	  } 
    return(val); 
   }
 else
 { 
  if(dat&0x32==0x32)//NR3(b1) = 1
  {
   //IF BR1(b7) = 1 AND last received BR1(b7) = 0 AND BR1(b6) = 1
   if(1)
     {
 	writedata(0x29,8);//NR2(b0)=1
     }
   else
   {
    //handle other M4 status changes here
     }
   }
 }
 
}

/*******选择NT AUTO-eoc激活********/
//激活:1.软件复位;2. 初始化相关寄存器;3.设置激活请求;4.若有激活请求中断进入中断处理

 void NT_activation()
 {
 	_nop_();
 	reset();
 	_nop_();
	NT_initial();
	_nop_();
	writedata(0x28,8);//NR2的b3置1激活请求
	_nop_();
	//判断是否有激活中断请求
	//进入中断处理
	 NT_interrupt();
 }


  /********LT 初始化**********/
   void LT_initial()
   {
    _nop_();
	writedata(0x70,8);//BR0地址0111-0000
	_nop_();
	writedata(0x7F,8);//M4发送数据,BR0数据7F-01111111
	_nop_();
	writedata(0x71,8);//BR1先写入地址0111-0001
  	_nop_();
	writedata(0x7F,8);//M4写入数据,BR1数据7F-01111111
	_nop_();
	writedata(0x72,8);//BR2写入地址0111-0010
  	_nop_();
	writedata(0xF0,8);//M5和M6写入数据,BR2数据F0-11110000
  	_nop_();
	writedata(0x79,8);//BR9先写入地址0111-1001
  	_nop_();
	writedata(0x8C,8);//BR9写入数据8C-10001100
 	_nop_();
	writedata(0x7A,8);//BR10先写入地址0111-1010
  	_nop_();
	writedata(0x01,8);//写入数据01-00000001 选择overlay reg有效
	_nop_();
	writedata(0x01,8);//OR7(bo)置1,M4通道模式
	_nop_();
	writedata(0x7A,8);//BR10先写入地址0111-1010
  	_nop_();
	writedata(0x00,8);//写入数据00-00000000 选择overlay reg无效
	_nop_();
	writedata(0x61,8);//R6地址0-110和前4位数据0001
	_nop_();
	writedata(0xFF,8);//R6后8位数据11111111
	_nop_();
	writedata(0x4E,8);//NR4中断使能1110,IRQ1,IRQ2,IRQ3使能
	delayms(50);
	}


/*******LT中断处理*********/
unsigned char LT_interrupt()
{
 unsigned char dut;
	if(1)
  	{
    
   	; }
	 else
 	{
 	  ;}
	return(dut);
}


/*******LT激活********/
//激活:1.软件复位;2. 初始化相关寄存器;3.设置激活请求;4.若有激活请求中断进入中断处理

 void LT_activation()
 {
 	_nop_();
 	reset();
 	_nop_();
	LT_initial();
	_nop_();
	writedata(0x28,8);//NR2的b3置1激活请求
	//判断是否有激活中断请求
	//进入中断处理
	LT_interrupt();
 }

	/******初始化各控制寄存器*******/

   void initial_reg()
 {
  delayms(100);
 
  //unsigned char x,y;
 /*****************************************************
 Nibble registers NR0~NR5为8位  地址是高4位的后3位为0-A2-A1-A0 低4位为数据
 //3位地址与NR0~NR5对应;地址6和7有其他作用
 //例如:NR1对应地址001
 ******************************************************/ 
 
  
 //WRITE NR2 有效控制寄存器
 writedata(0x24,8);//地址0-010,数据0100

//WRITE NR4 中断使能寄存器
 writedata(0x4F,8); //IRQ使能都有效,地址0-100,数据1111

//WRITE NR5 IDL2数据控制寄存器
  writedata(0x51,8);//地址0-101,block阻塞B1,B2通道,数据0001  0001不阻塞B1,B2通道

 

 /****************************************************
 Nibble register R6为双8位,R6的地址是前8位的高4位0-A2-A1-A0后12位为数据
 //固定地址6: 写地址为0-A2-A1-A0为0110读数据0-A2-A1-A0为1110
 // R6写读都可以为8位和16位选择 
******************************************************/

//R6 eoc 数据寄存器 Embedded Operations Channel (eoc)
 




 /****************************************************
 Byte registers BR0~BR15为双8位,前8位的低4位为地址0111-A3-A2-A1-A0后8位为数据
 //4位地址与BR0~BR15对应?
 // BR0~BR15写读都可以为8位和16位选择
******************************************************/

 //WRITE BR0 M4发送数据寄存器

writedata(0x70,8);// 先写入地址0111-0000
writedata(0xfd,8);// (选择写入数据)如果是网络到NT写入数据11111101/uoa-只有u接口有效置0
writedata(0x8f,8);// 如果是NT到网络写入数据10001111/
 
 //WRITE BR1 M4接收数据寄存器
writedata(0x71,8);//先写入地址0111-0001
writedata(0xfd,8);// (选择写入数据)如果是网络到NT写入数据11111101/uoa-只有u接口有效置0
writedata(0x8f,8);// 如果是NT到网络写入数据10001111/

 //WRITE BR2 M5与M6发送数据寄存器

writedata(0x72,8); //先写入地址0111-0010
writedata(0xf0,8); //b0-b3必须为0

//WRITE BR3 M5与M6接收数据寄存器

writedata(0x73,8); //先写入地址0111-0011
writedata(0xf0,8); //

 //WRITE BR4 febe 计数器
 //WRITE BR5 nebe 计数器
 //WRITE BR6 loopback IDL2 控制
 //WRITE BR7  IDL2 配置
 //WRITE BR8  发送帧和模式控制
 //WRITE BR9  主通道配置
 //WRITE BR10 覆盖选择寄存器

 //WRITE BR13 eco canceller测试寄存器
 //WRITE BR14 测试寄存器
 //WRITE BR15 校订数寄存器

 }

/**********************读出各状态寄存器的信息的函数***************/
 unsigned char read_statusReg()
{
unsigned char ddt;
 
//READ NR1  有效状态寄存器

//reaad BR1 and BR3

//READ BR11 有效状态寄存器

//READ BR12 有效状态测试寄存器

return(ddt);
 }


 //延时程序us和ms

void delayus(unsigned int a)//OSC-in用11.0592MHz
 {
   while(a--)
   {
    _nop_();//每一个nop指令周期为1us
   }
 }


void delayms(unsigned int b)//OSC-in用11.0592MHz
 {
   unsigned int c; 
   while(b--)
    {
   for(c=0;c<1001;c++)//1000us=1ms
     { 
	 _nop_();
	 }
    }
 }

⌨️ 快捷键说明

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