/******************************************************
**硬件连接: 两片164的CR接PTC0,CP接PTD3,输入口A接高电平,
第一片的输入口B接PTD2,另一片的输入口B接前一
片的Q7。将第一片的Q0-Q7接62256的A0-A7,另一片
的Q0-Q6接62256的A8-A14,62256的I/O的0-7接PTA0-7,
CS接PTC1,WE接PTC2,OE接PTC3,
**作者: 钱彬丰
**开始时间: 2005/7/12 9:00
**结束时间:2005/7/18 13:00
******************************************************/
#include <hidef.h> /* for EnableInterrupts macro */
#include <MC68HC908GP32.h> /* include peripheral declarations */
#define HC164_CR PTC_PTC0
#define RAM62256_CS PTC_PTC1
#define RAM62256_WE PTC_PTC2
#define RAM62256_OE PTC_PTC3
#define WR_DAC PTC_PTC4
#define RAM62256_IN_OUT PTA
#define HIGH 1
#define LOW 0
#define PMSH_N 0x01 //频率2.4576MHz
#define PMSL_N 0x2c
#define PMRS_L 0x80
#define PCTL_E 0x21
static word address @0x80;
static byte low_ad @0x82;
static byte high_ad @0x83;
/******************************************************
-------------------74HC164(CMOS)初始化-----------------
******************************************************/
void hc164_init()
{
byte delay;
DDRC_DDRC0=1;
delay=35;
HC164_CR=0; //清除74HC164中的数据
while(delay>0)
{
delay=delay-1;
} //等待40us
HC164_CR=1; //74HC164的转为高电平,开始接收数据
}
/*************************************************
------------------SPI主模式初始化-----------------
*************************************************/
void spi_master_init()
{
SPCR=0x3a; //无接收中断,主机方式,空闲时高电平
//SPSCK第一次跳变为移位开始信号,线或模式
//无发送中断
SPSCR=0x00; //无错误中断,2分频
}
/******************************************************
----------------------SPI发送数据----------------------
功能描述:将data中的值给SPDR,作为将要发送的数据
******************************************************/
void spi_sent_data(byte data)
{
while(SPSCR_SPTE==0)
{
}
SPDR=data;
}
/*************************************************
------------------SCI式初始化-----------------
*************************************************/
void sci_init()
{
SCC1=0x40; //允许SCI,正常输出,8位数据,无校验
SCC2=0x0C; // 不允许发送中断,不允许接受中断,允许发送、接受
SCBR=0x02; // 波特率9600
}
/******************************************************
----------------------SCI发送数据----------------------
功能描述:将data中的值给SCDR,作为将要发送的数据
******************************************************/
void sci_sent_data(byte data)
{
while(SCS1_SCTE==0)
{
}
SCDR=data;
}
/************************************************
------------------AD转换初始化-----------------
*************************************************/
void ADC_init()
{
ADCLK=0x30; //2分频,内部时钟
ADSCR=0x00; //0通道(PTB(0)),无中断,一次A/D转换
}
/************************************************
------------------定时器初始化-----------------
*************************************************/
void time_init()
{
T1SC=0x20; //定时器停止,无中断,1分频
T1MODH=0x01; //预置数为0132
T1MODL=0x32;
}
/*************************************************
-------------------总线频率设置-------------------
**************************************************/
void bus_frequence()
{
PCTL=0x00; //P=0,PLLON=0,关闭PLL
PBWC=0x80; //auto模式
PMSH=PMSH_N; //N高位
PMSL=PMSL_N; //N低位
PMRS=PMRS_L; //设置L
PCTL=PCTL_E; //E=2,PLLON=1,启动PLL
while(PBWC_LOCK==0) //等待,直到LOCK=1,频率稳定
{
}
PCTL_BCS=1; //频率锁定,选择PLL作为时钟源
}
/*********************************************
-------------------硬件延时-------------------
**********************************************/
void delay(byte time)
{
while(time>0)
{
time--;
}
}
void send_data_62256(byte data)
{
RAM62256_CS=LOW;
RAM62256_WE=LOW;
DDRA=0xff;
RAM62256_IN_OUT=data;
RAM62256_CS=HIGH;
}
void get_data_62256()
{
RAM62256_WE=HIGH;
RAM62256_OE=LOW;
RAM62256_CS=LOW;
DDRA=0x00;
WR_DAC=0;
}
void read_back()
{
word temp_ad;
time_init();
address=0x0000;
T1SC_TSTOP=0; //计时起开始计时
while(address<0x8000)
{
if(T1SC_TOF==1)
{
low_ad=address;
temp_ad=address;
temp_ad=temp_ad>>8;
high_ad=temp_ad;
//--------------------//
spi_sent_data(high_ad);
spi_sent_data(low_ad);
get_data_62256();
address++;
WR_DAC=1;
T1SC_TOF=0;
}
}
}
void record()
{
word temp_ad;
address=0x0000;
while(address<0x8000)
{
if(T1SC_TOF==1)
{
ADC_init();
low_ad=address;
temp_ad=address;
temp_ad=temp_ad>>8;
high_ad=temp_ad;
spi_sent_data(high_ad);
spi_sent_data(low_ad);
//---------------------------------//
while(ADSCR_COCO==0)
{
}
send_data_62256(ADR);
T1SC_TOF=0;
address++;
}
}
}
void main(void)
{
CONFIG1_COPD=1; //禁止看门狗
bus_frequence();
while(1)
{
time_init();
DDRC=0xff;
hc164_init();
spi_master_init();
T1SC_TSTOP=0; //计时起开始计时
record();
T1SC_TSTOP=1; //计时起停止计时
read_back();
T1SC_TSTOP=1; //计时起停止计时
}
for(;;);
}
数字录放系统
最新推荐文章于 2024-02-26 17:30:17 发布