📄 sub.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 + -