外部IC寄存器的位定义

宏定义法:即常量操作

方法1:用#define来定义,方便省事,缺点:系统不做检查

方法2:用enum来定义,可以像#define一样定义常量,同时系统做检查。既可以定义某个位也可以定义几个位的组合,备注:enum中标识不可以重复,但后面的值可以重复。

/*枚举法定义寄存器,枚举中的值可以重复但名称不能重复*/
// 通信寄存器bit定义

 1 enum
 2 {
 3     /* 寄存器选择 RS2 RS1 RS0 */
 4     REG_COMM = (0 << 4), /* 通信寄存器 */
 5     REG_SETUP = (1 << 4), /* 设置寄存器 */
 6     REG_CLOCK = (2 << 4), /* 时钟寄存器 */
 7     REG_DATA = (3 << 4), /* 数据寄存器,16位 */
 8     REG_TEST = (4 << 4), /* 测试寄存器 8位*/
 9     REG_NODO = (5 << 4), /* 无操作 */
10     REG_OFFSET = (6 << 4), /* 偏移(满标度校准)寄存器24位 */
11     REG_GAIN = (7 << 4), /* 增益(零标度校准)寄存器,24位 */
12 
13     /* 读写操作 */
14     WRITE = (0 << 3),     /* 写操作 */
15     READ = (1 << 3),     /* 读操作 */
16 
17     WAIT_MODE =(1 << 2),
18     WAIT_NONE =(0 << 2),
19     /*STBU =0X40 等待和掉电模式*/
20     /* 通道 */
21     CH_1 = (0 << 0), /* AIN1+ AIN1- */
22     CH_2 = (1 << 0), /* AIN2+ AIN2- */
23     CH_3 = (2 << 0), /* AIN1- AIN1- */
24     CH_4 = (3 << 0) /* AIN1- AIN2- */
25 };
26 
27 /* 设置寄存器bit定义 */
28 enum
29 {
30     MD_NORMAL = (0 << 6), /* 正常模式 */
31     MD_CAL_SELF = (1 << 6), 
32     /* 自校准模式,消除偏移和增益误差。上电执行一次,单极性是内部将IN+/-短接,时间是6倍输出速率,然后读数据到校准BUF中t=6 ×1/输出频率 ;tRdy=9 ×1/输出频率*/
33     MD_CAL_ZERO = (2 << 6), /* 校准0刻度模式 环境变化时执行0校准和满校准到对应的校准buf中,3 ×1/输出频率*/
34     MD_CAL_FULL = (3 << 6), /* 校准满刻度模式,tconv=3 ×1/输出频率,tRdy=4 ×1/输出频率 */
35 
36     GAIN_1 = (0 << 3),   /* 增益 */
37     GAIN_2 = (1 << 3),   /* 增益 */
38     GAIN_4 = (2 << 3),   /* 增益 */
39     GAIN_8 = (3 << 3),   /* 增益 */
40     GAIN_16 = (4 << 3),  /* 增益 */
41     GAIN_32 = (5 << 3),  /* 增益 */
42     GAIN_64 = (6 << 3),  /* 增益 */
43     GAIN_128 = (7 << 3), /* 增益 */
44 
45     /* 无论双极性还是单极性都不改变任何输入信号的状态,它只改变输出数据的代码和转换函数上的校准点 */
46     BIPOLAR = (0 << 2),  /* 双极性输入 */
47     UNIPOLAR = (1 << 2), /* 单极性输入 */
48 
49     BUF_NO = (0 << 1),   /* 输入无缓冲(内部缓冲器不启用) */
50     BUF_EN = (1 << 1),   /* 输入有缓冲 (启用内部缓冲器) */
51 
52     FSYNC_0 = 0,         /* 由1到0,从已知时间点(下一个时钟)开始采样 */
53     FSYNC_1 = 1          /* 不启用即不采样,处于复位状态 */
54 };
55 
56 /* 时钟寄存器bit定义 */
57 enum
58 {
59     CLKDIS_0 = (0<<4),   /* 时钟输出使能 (当外接晶振时,必须使能才能振荡) */
60     CLKDIS_1 =(1<<4),   /* 时钟禁止 (当外部提供时钟时,设置该位可以禁止MCK_OUT引脚输出时钟以省电 */
61 
62     /*
63         2.4576MHz(CLKDIV=0 )或为 4.9152MHz (CLKDIV=1 ),CLK 应置 “1”。
64         1MHz (CLKDIV=0 )或 2MHz (CLKDIV=1 ),CLK 该位应置 “0”
65     */
66 
67     CLKDIV= (1<<3),
68     CLK = (1<<2),
69 
70     CLK_4_9152M = (0x03<<2),            /*CLK=1*/
71     CLK_2_4576M = (0x01<<2),            /*CLK=1*/
72     CLK_1M = (0x00<<2),                 /*CLK=0*/
73     CLK_2M = (0x02<<2),                    /*CLK=0*/
74 
75     FS_50HZ = (0<<0)|CLK,                /*2ms输出一个数字*/
76     FS_60HZ = (1<<0)|CLK,
77     FS_250HZ = (2<<0)|CLK,
78     FS_500HZ = (3<<0)|CLK,
79 
80     FS_20HZ = (0<<0),
81     FS_25HZ = (1<<0),
82     FS_100HZ = (2<<0),
83     FS_200HZ = (3<<0),    
84 
85     /*
86     提高TM7705 精度的方法:
87     当使用主时钟为 2.4576MHz 时,强烈建议将时钟寄存器设为 84H,此时数据输出更新率为10Hz,即每0.1S 输出一个新数据。
88     当使用主时钟为 1MHz 时,强烈建议将时钟寄存器设为80H, 此时数据输出更新率为4Hz, 即每0.25S 输出一个新数据
89     */
90     // ZERO_0 = 0x00,
91     // ZERO_1 = 0x80
92 };
View Code

 

变量定义法:这样相当于定义了变量,通过修改变量和使用变量方法:参考

/*用结构体变量方法定义*/
Typedef union{
    uint_16 Reg_Bit16;
    struct{
    { // 低字节低位,低字节高位,高字节低位,高字节高位
        uint_16 bit0:0; //
        uint_16 bit1:1; //
        uint_16 bit2:2; //
        uint_16 bit3:3; //
        uint_16 bit4:4; //
        uint_16 bit5:5; //
        uint_16 bit6:6; //
        uint_16 bit7:7; //
        uint_16 bit8:8; //
        uint_16 bit9:9; //
        uint_16 bit10:1; //
        uint_16 bit10:10; //
        uint_16 bit11:11; //
        uint_16 bit12:12; //
        uint_16 bit13:13; //
        uint_16 bit14:14; //
        uint_16 bit15:15 //
    }Bits;
};

Extern volatile Reg_XXX @(REG_BASE + 0x00000039);//
#define FunBit Reg_XXX.Bits.bit0 // 寄存器的第0位


/*寄存器级别的使用,然后用宏定义定义其组合位定义*/
struct Reg_Bit8
{ // 低字节低位,低字节高位,高字节低位,高字节高位
    uint_8 busy/0 :1;     // 7 写0,读busy
    uint_8 RegType :3;     // 6:4
    uint_8 W/R :1;         // 3 Write/read
    uint_8 Waitmode :1; // 2
    uint_8 Chnl :4;     // 1:0 通道
};
union Communicate_REG
{
    uint_8 all;
    struct Reg_Bit8 bit;
};


struct Reg_Bit8
{ 
    // 低字节低位,低字节高位,高字节低位,高字节高位
    uint_8 WorkMODE :2; // 7:6 保留
    uint_8 Gain :3; // 5:3
    uint_8 POLAR :1; // 2 0=双极性
    uint_8 UseBUF :1; // 1=输入缓冲处理高阻抗源
    uint_8 FSYNC :1; // 0=从下一个点采样;1停止采样
};
union Config_REG
{
    uint_8 all;
    struct Reg_Bit8 bit;
};


struct Reg_Bit8
{ 
    // 低字节低位,低字节高位,高字节低位,高字节高位
    uint_8 rsvd :3; // 7:5 保留=000
    uint_8 CLKDIS :1; // 4 禁止=1
    uint_8 CLKDIV :1; // 3
    uint_8 CLK :1; // 2
    uint_8 FS :2; // 1:0和CLK一起决定输出速率
};
union CLK_REG
{
    uint_8 all;
    struct Reg_Bit8 bit;
};

/* 通信寄存器bit定义 */
/* 寄存器选择 RS2 RS1 RS0 */
#define REG_COMM (0 << 4)     /* 通信寄存器 */
#define REG_SETUP (1 << 4)     /* 设置寄存器 */
#define REG_CLOCK (2 << 4)     /* 时钟寄存器 */
#define REG_DATA (3 << 4)     /* 数据寄存器,16位 */
#define REG_TEST (4 << 4)     /* 测试寄存器 8位*/
#define REG_NODO (5 << 4)     /* 无操作 */
#define REG_OFFSET (6 << 4) /* 偏移(满标度校准)寄存器24位 */
#define REG_GAIN (7 << 4)     /* 增益(零标度校准)寄存器,24位 */

/* 读写操作 */
#define WRITE (0 << 3)         /* 写操作 */
#define READ  (1 << 3)         /* 读操作 */

#define WAIT_MODE (1 << 2)
#define WAIT_NONE (0 << 2)

/*通道 */
#define CH_1 (0 << 0)         /* AIN1+ AIN1- */
#define CH_2 (1 << 0)         /* AIN2+ AIN2- */
#define CH_3 (2 << 0)         /* AIN1- AIN1- */
#define CH_4 (3 << 0)         /* AIN1- AIN2- */
};

/* 设置寄存器bit定义 */


#define MD_NORMAL (0 << 6)         /* 正常模式 */
#define MD_CAL_SELF (1 << 6)     
/* 自校准模式,消除偏移和增益误差。上电执行一次,单极性是内部将IN+/-短接,时间是6倍输出速率,然后读数据到校准BUF中t=6 ×1/输出频率 ;tRdy=9 ×1/输出频率*/
#define MD_CAL_ZERO (2 << 6)     /* 校准0刻度模式 环境变化时执行0校准和满校准到对应的校准buf中,3 ×1/输出频率*/
#define MD_CAL_FULL (3 << 6)     /* 校准满刻度模式,tconv=3 ×1/输出频率,tRdy=4 ×1/输出频率 */
#define
#define GAIN_1 (0 << 3)         /* 增益 */
#define GAIN_2 (1 << 3)         /* 增益 */
#define GAIN_4 (2 << 3)         /* 增益 */
#define GAIN_8 (3 << 3)         /* 增益 */
#define GAIN_16 (4 << 3)         /* 增益 */
#define GAIN_32 (5 << 3)         /* 增益 */
#define GAIN_64 (6 << 3)         /* 增益 */
#define GAIN_128 (7 << 3)         /* 增益 */

/* 无论双极性还是单极性都不改变任何输入信号的状态,它只改变输出数据的代码和转换函数上的校准点 */
#define BIPOLAR (0 << 2) /* 双极性输入 */
#define UNIPOLAR (1 << 2) /* 单极性输入 */

#define BUF_NO (0 << 1) /* 输入无缓冲(内部缓冲器不启用) */
#define BUF_EN (1 << 1) /* 输入有缓冲 (启用内部缓冲器) */

#define FSYNC_0 0 /* 由1到0,从已知时间点(下一个时钟)开始采样 */
#define FSYNC_1 1 /* 不启用即不采样,处于复位状态 */
};

/* 时钟寄存器bit定义 */
enum
{
    #define CLKDIS_0 (0<<4) /* 时钟输出使能 (当外接晶振时,必须使能才能振荡) */
    #define CLKDIS_1 (1<<4) /* 时钟禁止 (当外部提供时钟时,设置该位可以禁止MCK_OUT引脚输出时钟以省电 */

    /* 2.4576MHz(CLKDIV=0 )或为 4.9152MHz (CLKDIV=1 ),CLK 应置 “1”。
    1MHz (CLKDIV=0 )或 2MHz (CLKDIV=1 ),CLK 该位应置 “0” */

    CLKDIV= (1<<3),
    CLK = (1<<2),

    #define CLK_4_9152M = (0x03<<2)/*CLK=1*/
    #define CLK_2_4576M = (0x01<<2)/*CLK=1*/
    #define CLK_1M = (0x00<<2) /*CLK=0*/
    #define CLK_2M = (0x02<<2)/*CLK=0*/

    #define FS_50HZ = (0<<0)|CLK/*2ms输出一个数字*/
    #define FS_60HZ = (1<<0)|CLK
    #define FS_250HZ = (2<<0)|CLK
    #define FS_500HZ = (3<<0)|CLK

    #define FS_20HZ = (0<<0)
    #define FS_25HZ = (1<<0)
    #define FS_100HZ = (2<<0)
    #define FS_200HZ = (3<<0)    

    /*提高TM7705 精度的方法:
    当使用主时钟为 2.4576MHz 时,强烈建议将时钟寄存器设为 84H,此时数据输出更新率为10Hz,即每0.1S 输出一个新数据。
    当使用主时钟为 1MHz 时,强烈建议将时钟寄存器设为80H, 此时数据输出更新率为4Hz, 即每0.25S 输出一个新数据*/
    // #define ZERO_0 0x00
    // #define ZERO_1 0x80
};

/*模块层级的使用*/
struct TM7705_REGS
{
    union Communicate_REG volatile ComReg; //
    Config_REG volatile ConfigReg;
    union CLK_REG volatile ClkReg;
    uint_16 volatile DataReg;
}TM7705;
View Code

 

posted on 2019-05-10 10:33  杰瑞鼠  阅读(624)  评论(0编辑  收藏  举报