问题是这样的,我手上有两个CAN的工程,都是间隔一秒往外发送4字节数据,其中一个没问题,但是有一个却总是有时会变成“扩展帧”、“远程帧”之类的(我发送的都是“标准帧-数据帧”),两个工程的CAN初始化、发送接收函数等都是一样的,后面把主函数都改成一样的了,还是不行,最后把两个工程的“SKEAZ1284.h”文件拿来对比了一下,果然发现CAN的初始化结构体“MSCAN_MemMapPtr”有一些些不一样:
以下是正常的:
typedef struct {
__IO uint8_t CANCTL0; /**< MSCAN Control Register 0, offset: 0x0 */
__IO uint8_t CANCTL1; /**< MSCAN Control Register 1, offset: 0x1 */
__IO uint8_t CANBTR0; /**< MSCAN Bus Timing Register 0, offset: 0x2 */
__IO uint8_t CANBTR1; /**< MSCAN Bus Timing Register 1, offset: 0x3 */
__IO uint8_t CANRFLG; /**< MSCAN Receiver Flag Register, offset: 0x4 */
__IO uint8_t CANRIER; /**< MSCAN Receiver Interrupt Enable Register, offset: 0x5 */
__IO uint8_t CANTFLG; /**< MSCAN Transmitter Flag Register, offset: 0x6 */
__IO uint8_t CANTIER; /**< MSCAN Transmitter Interrupt Enable Register, offset: 0x7 */
__IO uint8_t CANTARQ; /**< MSCAN Transmitter Message Abort Request Register, offset: 0x8 */
__I uint8_t CANTAAK; /**< MSCAN Transmitter Message Abort Acknowledge Register, offset: 0x9 */
__IO uint8_t CANTBSEL; /**< MSCAN Transmit Buffer Selection Register, offset: 0xA */
__IO uint8_t CANIDAC; /**< MSCAN Identifier Acceptance Control Register, offset: 0xB */
uint8_t RESERVED_0[1];
__IO uint8_t CANMISC; /**< MSCAN Miscellaneous Register, offset: 0xD */
__I uint8_t CANRXERR; /**< MSCAN Receive Error Counter, offset: 0xE */
__I uint8_t CANTXERR; /**< MSCAN Transmit Error Counter, offset: 0xF */
__IO uint8_t CANIDAR_BANK_1[4]; /**< MSCAN Identifier Acceptance Register n of First Bank, array offset: 0x10, array step: 0x1 */
__IO uint8_t CANIDMR_BANK_1[4]; /**< MSCAN Identifier Mask Register n of First Bank, array offset: 0x14, array step: 0x1 */
__IO uint8_t CANIDAR_BANK_2[4]; /**< MSCAN Identifier Acceptance Register n of Second Bank, array offset: 0x18, array step: 0x1 */
__IO uint8_t CANIDMR_BANK_2[4]; /**< MSCAN Identifier Mask Register n of Second Bank, array offset: 0x1C, array step: 0x1 */
union { /* offset: 0x20 */
__IO uint8_t REIDR0; /**< Receive Extended Identifier Register 0, offset: 0x20 */
__IO uint8_t RSIDR0; /**< Receive Standard Identifier Register 0, offset: 0x20 */
};
union { /* offset: 0x21 */
__IO uint8_t REIDR1; /**< Receive Extended Identifier Register 1, offset: 0x21 */
__IO uint8_t RSIDR1; /**< Standard Identifier Register 1, offset: 0x21 */
};
__IO uint8_t REIDR2; /**< Receive Extended Identifier Register 2, offset: 0x22 */
__IO uint8_t REIDR3; /**< Receive Extended Identifier Register 3, offset: 0x23 */
__IO uint8_t REDSR[8]; /**< Receive Extended Data Segment Register N, array offset: 0x24, array step: 0x1 */
__IO uint8_t RDLR; /**< Receive Data Length Register, offset: 0x2C */
uint8_t RESERVED_1[1];
__IO uint8_t RTSRH; /**< Receive Time Stamp Register High, offset: 0x2E */
__IO uint8_t RTSRL; /**< Receive Time Stamp Register Low, offset: 0x2F */
union { /* offset: 0x30 */
__IO uint8_t TEIDR0; /**< Transmit Extended Identifier Register 0, offset: 0x30 */
__IO uint8_t TSIDR0; /**< Transmit Standard Identifier Register 0, offset: 0x30 */
};
union { /* offset: 0x31 */
__IO uint8_t TEIDR1; /**< Transmit Extended Identifier Register 1, offset: 0x31 */
__IO uint8_t TSIDR1; /**< Transmit Standard Identifier Register 1, offset: 0x31 */
};
__IO uint8_t TEIDR2; /**< Transmit Extended Identifier Register 2, offset: 0x32 */
__IO uint8_t TEIDR3; /**< Transmit Extended Identifier Register 3, offset: 0x33 */
__IO uint8_t TEDSR[8]; /**< Transmit Extended Data Segment Register N, array offset: 0x34, array step: 0x1 */
__IO uint8_t TDLR; /**< This register keeps the data length field of the CAN frame., offset: 0x3C */
__IO uint8_t TBPR; /**< Transmit Buffer Priority Register, offset: 0x3D */
__IO uint8_t TTSRH; /**< Transmit Time Stamp Register High, offset: 0x3E */
__IO uint8_t TTSRL; /**< Transmit Time Stamp Register Low, offset: 0x3F */
} MSCAN_Type, *MSCAN_MemMapPtr;
以下是有问题的:
typedef struct {
__IO uint8_t CANCTL0; /**< MSCAN Control Register 0, offset: 0x0 */
__IO uint8_t CANCTL1; /**< MSCAN Control Register 1, offset: 0x1 */
__IO uint8_t CANBTR0; /**< MSCAN Bus Timing Register 0, offset: 0x2 */
__IO uint8_t CANBTR1; /**< MSCAN Bus Timing Register 1, offset: 0x3 */
__IO uint8_t CANRFLG; /**< MSCAN Receiver Flag Register, offset: 0x4 */
__IO uint8_t CANRIER; /**< MSCAN Receiver Interrupt Enable Register, offset: 0x5 */
__IO uint8_t CANTFLG; /**< MSCAN Transmitter Flag Register, offset: 0x6 */
__IO uint8_t CANTIER; /**< MSCAN Transmitter Interrupt Enable Register, offset: 0x7 */
__IO uint8_t CANTARQ; /**< MSCAN Transmitter Message Abort Request Register, offset: 0x8 */
__I uint8_t CANTAAK; /**< MSCAN Transmitter Message Abort Acknowledge Register, offset: 0x9 */
__IO uint8_t CANTBSEL; /**< MSCAN Transmit Buffer Selection Register, offset: 0xA */
__IO uint8_t CANIDAC; /**< MSCAN Identifier Acceptance Control Register, offset: 0xB */
uint8_t RESERVED_0[1];
__IO uint8_t CANMISC; /**< MSCAN Miscellaneous Register, offset: 0xD */
__I uint8_t CANRXERR; /**< MSCAN Receive Error Counter, offset: 0xE */
__I uint8_t CANTXERR; /**< MSCAN Transmit Error Counter, offset: 0xF */
__IO uint8_t CANIDAR_BANK_1[4]; /**< MSCAN Identifier Acceptance Register n of First Bank, array offset: 0x10, array step: 0x1 */
__IO uint8_t CANIDMR_BANK_1[4]; /**< MSCAN Identifier Mask Register n of First Bank, array offset: 0x14, array step: 0x1 */
__IO uint8_t CANIDAR_BANK_2[4]; /**< MSCAN Identifier Acceptance Register n of Second Bank, array offset: 0x18, array step: 0x1 */
__IO uint8_t CANIDMR_BANK_2[4]; /**< MSCAN Identifier Mask Register n of Second Bank, array offset: 0x1C, array step: 0x1 */
union { /* offset: 0x20 */
__IO uint8_t REIDR0; /**< Receive Extended Identifier Register 0, offset: 0x20 */
__IO uint8_t RSIDR0; /**< Receive Standard Identifier Register 0, offset: 0x20 */
};
union { /* offset: 0x21 */
__IO uint8_t REIDR1; /**< Receive Extended Identifier Register 1, offset: 0x21 */
__IO uint8_t RSIDR1; /**< Standard Identifier Register 1, offset: 0x21 */
__IO uint8_t TSIDR1; /**< Transmit Standard Identifier Register 1, offset: 0x21 */
};
__IO uint8_t REIDR2; /**< Receive Extended Identifier Register 2, offset: 0x22 */
__IO uint8_t REIDR3; /**< Receive Extended Identifier Register 3, offset: 0x23 */
__IO uint8_t REDSR[8]; /**< Receive Extended Data Segment Register N, array offset: 0x24, array step: 0x1 */
__IO uint8_t RDLR; /**< This register keeps the data length field of the CAN frame., offset: 0x2C */
uint8_t RESERVED_1[1];
__IO uint8_t RTSRH; /**< Receive Time Stamp Register High, offset: 0x2E */
__IO uint8_t RTSRL; /**< Receive Time Stamp Register Low, offset: 0x2F */
union { /* offset: 0x30 */
__IO uint8_t TEIDR0; /**< Transmit Extended Identifier Register 0, offset: 0x30 */
__IO uint8_t TSIDR0; /**< Transmit Standard Identifier Register 0, offset: 0x30 */
};
__IO uint8_t TEIDR1; /**< Transmit Extended Identifier Register 1, offset: 0x31 */
__IO uint8_t TEIDR2; /**< Transmit Extended Identifier Register 2, offset: 0x32 */
__IO uint8_t TEIDR3; /**< Transmit Extended Identifier Register 3, offset: 0x33 */
__IO uint8_t TEDSR[8]; /**< Transmit Extended Data Segment Register N, array offset: 0x34, array step: 0x1 */
__IO uint8_t TDLR; /**< This register keeps the data length field of the CAN frame., offset: 0x3C */
__IO uint8_t TBPR; /**< Transmit Buffer Priority Register, offset: 0x3D */
__IO uint8_t TTSRH; /**< Transmit Time Stamp Register High, offset: 0x3E */
__IO uint8_t TTSRL; /**< Transmit Time Stamp Register Low, offset: 0x3F */
} MSCAN_Type,*MSCAN_MemMapPtr;
换上之后就好了,虽然我也搞不懂为什么,但是总算是解决了!