struct _BITS_32
{
unsigned char bit00: 1;
unsigned char bit01: 1;
unsigned char bit02: 1;
unsigned char bit03: 1;
unsigned char bit04: 1;
unsigned char bit05: 1;
unsigned char bit06: 1;
unsigned char bit07: 1;
unsigned char bit08: 1;
unsigned char bit09: 1;
unsigned char bit10: 1;
unsigned char bit11: 1;
unsigned char bit12: 1;
unsigned char bit13: 1;
unsigned char bit14: 1;
unsigned char bit15: 1;
unsigned char bit16: 1;
unsigned char bit17: 1;
unsigned char bit18: 1;
unsigned char bit19: 1;
unsigned char bit20: 1;
unsigned char bit21: 1;
unsigned char bit22: 1;
unsigned char bit23: 1;
unsigned char reserved: 8;
};
typedef union
{
unsigned long AllMsg;
struct _BITS_32 bits;
}BITS_32;
BITS_32 tb;
void test(void)
{
unsigned long Alldata;
unsigned char i;
unsigned char cn;//收到的資料
//用這樣收集資料聚集起來,從hi bit開始收
for(i=0;i<23;i++)
{
Alldata = (Alldata << 1) | (cn & 0x01);
}
//用這樣收集資料聚集起來,從low bit開始收
for(i=0;i<23;i++)
{
Alldata = Alldata | ( (cn & 0x01) << i );
}
//最後如果要讀取一個bit的資料
tb.AllMsg = Alldata;
cn = tb.bits.bit00 ; //類似這樣就可以讀取bit0資料
}
----------------------------------------------------------------------------------
typedef union {
unsigned char msgfields;
struct{
unsigned char idType:1; // 1 bit (Standard Frame or Extended Frame)
unsigned char frameType:1; // 1 bit (Data Frame or RTR Frame)
unsigned char dlc:4; // 4 bit (No of data bytes a message frame contains)
unsigned char formatType:1; // 1 bit (CAN 2.0 Format or CAN_FD Format)
unsigned char brs:1; // 1 bit (Bit Rate Switch)
};
} CAN_MSG_FIELD;
unsigned char AddrL @ 0x72;
struct {
unsigned L0 :1;
unsigned L1 :1;
unsigned L2 :1;
unsigned L3 :1;
unsigned L4 :1;
unsigned L5 :1;
unsigned L6 :1;
unsigned L7 :1;
}AddrLbits @ 0x72;
CAN_MSG_FIELD yy;
yy.msgfields=0x80;
TXREG=yy.msgfields;
__delay_ms(30);
yy.brs=1;
yy.dlc=0xf;
yy.formatType=1;
yy.frameType=1;
yy.idType=1;
TXREG=yy.msgfields;
驗證結果
0X80 與 0XFF
------------------------------
AddrLbits.L0=1;
AddrLbits.L1=0;
AddrLbits.L2=1;
AddrLbits.L3=0;
AddrLbits.L4=0;
AddrLbits.L5=1;
AddrLbits.L6=0;
AddrLbits.L7=1;
TXREG=AddrL;
__delay_ms(500);
驗證結果
0XA5 |