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

📄 project_init.c

📁 测试CAN接口(sja1000) ,每接收到一帧数据,就 原样 回发 一帧!!!! (拨码开关全 拨到 ON ,上位机 发送帧 ID为 0)
💻 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 + -