在PIC32中CPU所使用的是左边的虚拟地址,而外设使用的是右边的物理地址。也即使说软件操作写入外设寄存器(左边),CPU会对其转换为右边的物理地址。手册中指出C2FIFOBA、C2FIFOUAn为物理地址。C2FIFOUAn为FIFOn的起始地址,在需要从FIFO中读取或写入数据时,需要将C2FIFOUAn转换为左边的虚拟地址后通过软件读取或写入。
typedef union
{
struct
{
unsigned TXCMSGSID_SID:11;
unsigned :21;
unsigned TXCMSGEID_DLC:4;
unsigned TXCMSGEID_RB0:1;
unsigned :3;
unsigned TXCMSGEID_RB1:1;
unsigned TXCMSGEID_RTR:1;
unsigned TXCMSGEID_EID:18;
unsigned TXCMSGEID_IDE:1;
unsigned TXCMSGEID_SRR:1;
unsigned :2;
unsigned TXCMSGDATA0_Byte0:8;
unsigned TXCMSGDATA0_Byte1:8;
unsigned TXCMSGDATA0_Byte2:8;
unsigned TXCMSGDATA0_Byte3:8;
unsigned TXCMSGDATA1_Byte4:8;
unsigned TXCMSGDATA1_Byte5:8;
unsigned TXCMSGDATA1_Byte6:8;
unsigned TXCMSGDATA1_Byte7:8;
};
uint32_t TXMessage[4];
}CANTXBuffer;
typedef union
{
struct
{
unsigned RXCMSGSID_SID:11;
unsigned RXCMSGSID_FILHIT:5;
unsigned RXCMSGSID_CMSGTS:16;
unsigned RXCMSGEID_DLC:4;
unsigned RXCMSGEID_RB0:1;
unsigned :3;
unsigned RXCMSGEID_RB1:1;
unsigned RXCMSGEID_RTR:1;
unsigned RXCMSGEID_EID:18;
unsigned RXCMSGEID_IDE:1;
unsigned RXCMSGEID_SRR:1;
unsigned :2;
unsigned RXCMSGDATA0_Byte0:8;
unsigned RXCMSGDATA0_Byte1:8;
unsigned RXCMSGDATA0_Byte2:8;
unsigned RXCMSGDATA0_Byte3:8;
unsigned RXCMSGDATA1_Byte4:8;
unsigned RXCMSGDATA1_Byte5:8;
unsigned RXCMSGDATA1_Byte6:8;
unsigned RXCMSGDATA1_Byte7:8;
};
uint32_t RXMessage[4];
}CANRXBuffer;
CANTXBuffer *CAN2TXBuffer;
CAN2TXBuffer = (CANTXBuffer*)(PA_TO_KVA1(C2FIFOUA0));
//相应内容存储于以下
//CAN2TXBuffer->TXMessage[0]
//CAN2TXBuffer->TXMessage[1]
//CAN2TXBuffer->TXMessage[2]
//CAN2TXBuffer->TXMessage[3]
CANRXBuffer *CAN2RXBuffer1,*CAN2RXBuffer2,*CAN2RXBuffer3,*CAN2RXBuffer4;
CAN2RXBuffer1 = (CANRXBuffer*)(PA_TO_KVA1(C2FIFOUA1));
//相应内容存储于以下
//CAN2RXBuffer1->RXMessage[0]
//CAN2RXBuffer1->RXMessage[1]
//CAN2RXBuffer1->RXMessage[2]
//CAN2RXBuffer1->RXMessage[3]
CAN2RXBuffer2 = (CANRXBuffer*)(PA_TO_KVA1(C2FIFOUA2));
//相应内容存储于以下
//CAN2RXBuffer2->RXMessage[0]
//CAN2RXBuffer2->RXMessage[1]
//CAN2RXBuffer2->RXMessage[2]
//CAN2RXBuffer2->RXMessage[3]
CAN2RXBuffer3 = (CANRXBuffer*)(PA_TO_KVA1(C2FIFOUA3));
//相应内容存储于以下
//CAN2RXBuffer3->RXMessage[0]
//CAN2RXBuffer3->RXMessage[1]
//CAN2RXBuffer3->RXMessage[2]
//CAN2RXBuffer3->RXMessage[3]
CAN2RXBuffer4 = (CANRXBuffer*)(PA_TO_KVA1(C2FIFOUA4));
//相应内容存储于以下
//CAN2RXBuffer4->RXMessage[0]
//CAN2RXBuffer4->RXMessage[1]
//CAN2RXBuffer4->RXMessage[2]
//CAN2RXBuffer4->RXMessage[3]
|