📄 project_init.c
字号:
//**************************************************************************************************
//描 述:工程初始化模块 *
//文 件 名:project_init.c *
//日 期:2007年7月11日 *
//**************************************************************************************************
/*
高8位地址总线使用P4口,低8位地址总线/数据总线使用P6口
修改历史记录列表:
<修改日期> <修改内容简述>
2007/07/11 建立
*/
//**************************************************************************************************
#include "project_init.h"
//***************************************************************************************************
//********************************* 全局变量定义 ************************************************
//***************************************************************************************************
//***************************************************************************************************
//*********************************** 函数实现 **************************************************
//***************************************************************************************************
//***************************************************************************************************
//函数原型: INT8U read_sja_reg(INT8U reg_addr) *
//参数说明: reg_addr ; SJA1000内部寄存器地址 *
//返 回 值: 对应地址(reg_addr)的数据 *
//说 明: 读 SJA1000 内部寄存器 *
//***************************************************************************************************
INT8U read_sja_reg(INT8U reg_addr)
{
INT8U reg_data;
//建立数据通道
P6DIR = 0xff; //数据/低8位地址总线 为 输出
Set_4245OE_enable(); // 数据总线4245 OE 有效(OE=0)
Set_MCU_Write(); // MCU 写 数据/低8位地址总线
_NOP(); _NOP(); _NOP(); _NOP(); _NOP();
Set_ALE_High();
_NOP(); _NOP(); _NOP(); _NOP(); _NOP();
P6OUT = reg_addr; //向地址总线 送 sja1000 地址
_NOP(); _NOP(); _NOP(); _NOP(); _NOP();
Set_ALE_Low(); //地址 锁存
_NOP(); _NOP(); _NOP(); _NOP(); _NOP();
P6DIR = 0x00; //设置 数据/低8位地址总线 为输入,准备读取数据
Set_MCU_Read(); // MCU 读 数据/低8位地址总线
_NOP(); _NOP(); _NOP(); _NOP(); _NOP();
cs_sja1000_enable(); //SJA1000片选 使能(置0)
_NOP(); _NOP();
Set_RD_Low(); //读 有效
_NOP(); _NOP(); _NOP(); _NOP(); _NOP();
reg_data = P6IN; //从数据总线读入数据
_NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP();
Set_RD_High(); //读 无效
_NOP(); _NOP(); _NOP(); _NOP(); _NOP();
cs_sja1000_disable(); //SJA1000片选 无效(置1)
Set_4245OE_disable(); // 数据总线4245 OE 无效(OE=1)
_NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP();
return reg_data;
}
//***************************************************************************************************
//函数原型: void write_sja_reg(INT8U reg_addr,INT8U reg_data) *
//参数说明: reg_addr ; SJA1000内部寄存器地址 *
// reg_data ; 要写入SJA1000内部寄存器的数据 *
//返 回 值: 无 *
//说 明: 写 SJA1000 内部寄存器 *
//***************************************************************************************************
void write_sja_reg(INT8U reg_addr,INT8U reg_data)
{
//建立数据通道
P6DIR = 0xff; //数据/低8位地址总线 为 输出
Set_4245OE_enable(); // 数据总线4245 OE 有效(OE=0)
Set_MCU_Write(); // MCU 写 数据/低8位地址总线
_NOP(); _NOP(); _NOP(); _NOP(); _NOP();
Set_ALE_High();
_NOP(); _NOP(); _NOP(); _NOP(); _NOP();
P6OUT = reg_addr; //向地址总线 送 sja1000 地址
_NOP(); _NOP(); _NOP(); _NOP(); _NOP();
Set_ALE_Low(); //地址 锁存
_NOP(); _NOP(); _NOP(); _NOP(); _NOP();
cs_sja1000_enable(); //SJA1000片选 使能(置0)
_NOP(); _NOP();
Set_WR_Low(); //写 有效
_NOP(); _NOP(); _NOP(); _NOP(); _NOP();
P6OUT = reg_data; //向数据总线写数据
_NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP();
Set_WR_High(); //写 无效
_NOP(); _NOP(); _NOP(); _NOP(); _NOP();
cs_sja1000_disable(); //SJA1000片选 无效(置1)
_NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP(); _NOP();
P6DIR = 0x00; //恢复数据/低8位地址总线 为 输入状态
Set_4245OE_disable(); // 数据总线4245 OE 无效(OE=1)
Set_MCU_Read(); //恢复为 MCU 读 数据/低8位地址总线状态
}
//***************************************************************************************************
//函数原型: void init_port(void) *
//参数说明: 无 *
//返 回 值: 无 *
//说 明: MCU 端口初始化 *
//***************************************************************************************************
void init_port(void)
{
// P6OUT = 0xff; //全部输出高电平,指向最高位地址,防止破坏低位有效数据
P6DIR = 0x00; //输入,作 数据总线 时,是 双向总线
P6SEL = 0x00; //一般 IO 口,作 数据/低8位地址总线 分时复用
P5OUT = 0xff; //全部输出高电平,禁能RAM的E(P5.2);禁能OE(P5.4);禁能WR(P5.5);禁能RD(P5.6)
P5OUT &= ~BIT7; //初始化时使 P5.7(ALE) 输出为低电平
// P5OUT &= ~BIT4; //初始化时使 P5.4(OE) 输出为低电平
P5OUT |= BIT3; //初始化时使 P5.3(DIR) 输出为高电平(使 数据/低8位地址总线 进入 MCU 读 总线 状态)
P5OUT &= ~BIT1; //初始化时使 P5.1(573的G端) 输出为低电平
P5OUT &= ~BIT0; //初始化时使 P5.0(A16) 输出为低电平,操作 FM20L08 的 低 64K字节
P5DIR = 0xff; //输出
P5SEL = 0x00; //一般 IO 口
// //端口初始化完成后,使 数据/低8位地址总线 进入 MCU 读 总线 状态
// P5OUT &= ~BIT4; //初始化时使 P5.4(OE) 输出为低电平
// P5OUT |= BIT3; //初始化时使 P5.3(DIR) 输出为高电平
// P4OUT = 0xff; //全部输出高电平,指向最高位地址,防止破坏低位有效数据
P4DIR = 0x00; //输入
P4SEL = 0x00; //一般 IO 口,作 高8位地址总线 用
P3OUT = 0xff; //全部输出高电平,禁能SJA1000(P3.0);禁能8255(P3.1);禁能TLC2543(P3.2);禁能蜂鸣器(P3.3)
// P3OUT &= ~BIT3; //禁止 蜂鸣器 鸣叫(拉低P3.3)
P3DIR = 0xff; //输出
P3DIR |= BIT7; //P3.7设为输入(RXD)
P3SEL = 0; //一般 IO 口
P3SEL |= BIT6; //设置P3.6为UART1的TXD
P3SEL |= BIT7; //设置P3.7为UART1的RXD
P2DIR = 0; //输入
P2SEL = 0; //一般 IO 口
P2IE = 0; //设置P2无中断功能
P2IES = 0; //上升沿中断
P2IFG = 0; //清除中断标志
P2IES |= BIT0; //对应管脚由高到低电平跳变使相应中断标志置位
// P2IE |= BIT0; //管脚 P2.0(SJA1000中断输入) 使能中断
P1OUT = 0xff; //全部输出高电平,禁能74HC245(P1.3)
P1DIR = (BIT0 | BIT1 | BIT2 | BIT3); //输出(看门狗WDI;指示灯P1_1,P1_2;74HC245的OE),LVL(P1.7)输入
P1SEL = 0; //一般 IO 口
P1IE = 0; //设置P1无中断功能
P1IES = 0; //上升沿中断
P1IFG = 0; //清除中断标志
}
//***************************************************************************************************
//函数原型: void init_clk(void) *
//参数说明: 无 *
//返 回 值: 无 *
//说 明: 时钟系统 初始化 *
//***************************************************************************************************
void init_clk(void)
{
INT16U i;
BCSCTL1 = 0x00; //将寄存器的内容清0
//XT2振荡器开启
//LFTX1工作在低频模式
//ACLK的分频因子为1
do
{
IFG1 &= ~OFIFG; //清除OSCFault标志
for (i = 0x20; i > 0; i--);
}
while ((IFG1 & OFIFG) == OFIFG); //如果OSCFault = 1
BCSCTL2 = 0x00; //将寄存器内容清0
BCSCTL2 += SELM1; //MCLK的时钟源为TX2CLK,分频因子为1
BCSCTL2 += SELS; //SCLK的时钟源为TX2CLK,分频因子为1
// BCSCTL1 = XT2OFF; //将寄存器的内容清0
// //XT2振荡器关闭
// //LFTX1工作在低频模式
// //ACLK的分频因子为1
// do
// {
// IFG1 &= ~OFIFG; //清除OSCFault标志
// for (i = 0x20; i > 0; i--);
// }
// while ((IFG1 & OFIFG) == OFIFG); //如果OSCFault = 1
//
// BCSCTL2 = 0x00; //将寄存器内容清0
// BCSCTL2 += SELM1; //MCLK的时钟源为TX2CLK,分频因子为1
// BCSCTL2 += SELS; //SCLK的时钟源为TX2CLK,分频因子为1
return;
}
//***************************************************************************************************
//函数原型: void init_system(void) *
//参数说明: 无 *
//返 回 值: 无 *
//说 明: 系统初始化 *
//***************************************************************************************************
void init_system(void)
{
init_clk(); //初始化 系统时钟
init_port(); //初始化 MCU 430端口
init_sja1000(); //初始化 sja1000
read_switch(); //读拨码开关,设置本机地址
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -