?? can.c
字號:
// - ----------------------------------------------------------------------------
// - ATMEL Microcontroller Software Support - ROUSSET -
// - ----------------------------------------------------------------------------
// - DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
// - IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
// - DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
// - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
// - OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// - LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
// - EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// - ----------------------------------------------------------------------------
// File Name : can.c
// - ----------------------------------------------------------------------------
#include "main.h"
//*----------------------------------------------------------------------------
//* \fn AT91F_InitMailbox
//* \brief Configure the MBx
//*----------------------------------------------------------------------------
void AT91F_InitMailbox(void)
{
// Init CAN0 Mailbox 0
AT91F_InitMailboxRegisters( AT91C_BASE_CAN0_MB0,
AT91C_CAN_MOT_TX | AT91C_CAN_PRIOR,
0x00000000,
AT91C_CAN_MIDvA & (0x07<<18), // ID 7
0x23456789,
0x98765432,
(AT91C_CAN_MDLC & (0x8<<16)) );
// Init CAN1 Mailbox 0
AT91F_InitMailboxRegisters( AT91C_BASE_CAN1_MB0,
AT91C_CAN_MOT_RX | AT91C_CAN_PRIOR,
AT91C_CAN_MIDvA | AT91C_CAN_MIDvB | AT91C_CAN_MIDE,
AT91C_CAN_MIDvA & (0x07<<18), // ID 7
0x00000000,
0x00000000,
0x00000000);
// Init CAN0 Mailbox 1
AT91F_InitMailboxRegisters( AT91C_BASE_CAN0_MB1,
AT91C_CAN_MOT_TX | (AT91C_CAN_PRIOR),
AT91C_CAN_MIDvA | AT91C_CAN_MIDvB | AT91C_CAN_MIDE,
AT91C_CAN_MIDvA & (0x09<<18), // ID 9
0xAABBCCDD,
0xCAFEDECA,
(AT91C_CAN_MDLC & (0x8<<16)) );
// Init CAN0 Mailbox 2
AT91F_InitMailboxRegisters( AT91C_BASE_CAN0_MB2,
AT91C_CAN_MOT_TX |(AT91C_CAN_PRIOR-1),
0x00000000,
AT91C_CAN_MIDvA & (0x0A<<18), // ID 10
0x55667788,
0x99AABBCC,
(AT91C_CAN_MDLC & (0x8<<16)) );
// Init CAN1 Mailbox 15 ,ID號為全0的信箱可以接收所有信箱消息
AT91F_InitMailboxRegisters( AT91C_BASE_CAN1_MB15,
AT91C_CAN_MOT_RXOVERWRITE | AT91C_CAN_PRIOR,
0x00000000,
0x00000000,
0x00000000,
0x00000000,
0x00000000);
// Init CAN0 Mailbox 3
AT91F_InitMailboxRegisters( AT91C_BASE_CAN0_MB3,
AT91C_CAN_MOT_CONSUMER | AT91C_CAN_PRIOR,
AT91C_CAN_MIDvA | AT91C_CAN_MIDvB | AT91C_CAN_MIDE,
AT91C_CAN_MIDvA & (0x0B<<18), // ID 11
0x00000000,
0x00000000,
0x00000000);
// Init CAN1 Mailbox 3
AT91F_InitMailboxRegisters( AT91C_BASE_CAN1_MB3,
AT91C_CAN_MOT_PRODUCER | AT91C_CAN_PRIOR,
0x00000000,
AT91C_CAN_MIDvA & (0x0B<<18), // ID 11
0xBEBED0D0,
0xC0C06969,
(AT91C_CAN_MDLC & (0x8<<16)) );
}
//*----------------------------------------------------------------------------
//* \fn AT91F_BasicTestSuite
//* \brief
//*----------------------------------------------------------------------------
void AT91F_BasicTestSuite(void)
{
unsigned int status;
unsigned int tick=0;
///////////////////////////////////////////////////////////////////////////////////////////
TRACE_INFO("\n\r--------------------------------------------------\n\r");
TRACE_INFO("1. Wait for CAN Controllers Bus Synchronization...\n\r");
TRACE_INFO("--------------------------------------------------\n\r");
// Enable CAN and Wait for WakeUp Interrupt
AT91F_CAN_EnableIt(AT91C_BASE_CAN0,AT91C_CAN_WAKEUP);
AT91F_CAN_EnableIt(AT91C_BASE_CAN1,AT91C_CAN_WAKEUP);
AT91F_CAN_CfgModeReg(AT91C_BASE_CAN0,AT91C_CAN_CANEN);
AT91F_CAN_CfgModeReg(AT91C_BASE_CAN1,AT91C_CAN_CANEN);
// Wait for WAKEUP flag raising <=> 11-recessive-bit were scanned by the transceiver
while( ((testCAN0!=AT91C_TEST_OK) || (testCAN1!=AT91C_TEST_OK)) && (tick<AT91C_CAN_TIMEOUT) ) {
tick++;
}
testCAN0=testCAN1=AT91C_TEST_NOK;
if (tick == AT91C_CAN_TIMEOUT) {
TRACE_ERROR("-E- CAN0 & CAN1 Initialisations FAILED !\n\r");
} else {
TRACE_INFO("-I- CAN0 & CAN1 Initialisations Completed !\n\r");
}
// Configure Mailboxes
AT91F_InitMailbox();
///////////////////////////////////////////////////////////////////////////////////////////
TRACE_INFO("\n\r---------------------------------------------------\n\r");
TRACE_INFO("2. CAN0 Mailbox 0 transmitting to CAN1 Mailbox 0...\n\r");
TRACE_INFO("---------------------------------------------------\n\r");
TRACE_INFO("-- CAN0 Mailbox 0: Tx Mailbox \n\r");
TRACE_INFO("-- CAN1 Mailbox 0: Rx Mailbox \n\r");
TRACE_INFO("---------------------------------------------------\n\r");
// Ask Transmission on Mailbox 0 --> AT91C_CAN_MRDY raises for Mailbox 0 CAN_MB_SR
AT91F_CAN_InitTransferRequest(AT91C_BASE_CAN0,AT91C_CAN_MB0);
tick=0;
do {
status = AT91F_CAN_GetMessageStatus(&(AT91C_BASE_CAN1->CAN_MB0));
}
while( !(status & AT91C_CAN_MRDY) && (++tick<AT91C_CAN_TIMEOUT) );
if (tick == AT91C_CAN_TIMEOUT) {
TRACE_ERROR("-E- Test FAILED !\n\r");
} else {
TRACE_INFO("-I- Tranfer Completed: CAN1 Mailbox 0 MRDY flag has raised.\n\r");
if( AT91F_CAN_GetMessageDataLow(&AT91C_BASE_CAN0->CAN_MB0) != AT91F_CAN_GetMessageDataLow(&AT91C_BASE_CAN1->CAN_MB0) )
TRACE_ERROR("-E- Data Corrupted !\n\r");
if( AT91F_CAN_GetMessageDataHigh(&AT91C_BASE_CAN0->CAN_MB0) != AT91F_CAN_GetMessageDataHigh(&AT91C_BASE_CAN1->CAN_MB0) )
TRACE_ERROR("-E- Data Corrupted !\n\r");
}
///////////////////////////////////////////////////////////////////////////////////////////
TRACE_INFO("\n\r----------------------------------------------------------\n\r");
TRACE_INFO("3. CAN0 Mailboxes 1 & 2 transmitting to CAN1 Mailbox 15...\n\r");
TRACE_INFO("----------------------------------------------------------\n\r");
TRACE_INFO("-- CAN0 Mailbox 1 : Tx Mailbox \n\r");
TRACE_INFO("-- CAN0 Mailbox 2 : Tx Mailbox \n\r");
TRACE_INFO("-- CAN1 Mailbox 15: Rx with Overwrite Mailbox \n\r");
TRACE_INFO("----------------------------------------------------------\n\r");
// Ask Transmissions on Mailbox 1 & 2 --> AT91C_CAN_MRDY & AT91C_CAN_MMI raises for Mailbox 15 CAN_MB_SR
AT91F_CAN_InitTransferRequest(AT91C_BASE_CAN0,AT91C_CAN_MB1|AT91C_CAN_MB2);
// Wait for Last Transmit Mailbox
tick=0;
do {
status = AT91F_CAN_GetMessageStatus(&(AT91C_BASE_CAN1->CAN_MB15));
}
while( !(status & AT91C_CAN_MMI) && (++tick<AT91C_CAN_TIMEOUT) );
if (tick == AT91C_CAN_TIMEOUT) {
TRACE_ERROR("-E- Test FAILED !\n\r");
} else {
TRACE_INFO("-I- Tranfers Completed: CAN1 Mailbox 15 MRDY and MMI flags have raised.\n\r");
if( AT91F_CAN_GetMessageDataLow(&AT91C_BASE_CAN0->CAN_MB1) != AT91F_CAN_GetMessageDataLow(&AT91C_BASE_CAN1->CAN_MB15) )
TRACE_ERROR("-E- Data Corrupted !\n\r");
if( AT91F_CAN_GetMessageDataHigh(&AT91C_BASE_CAN0->CAN_MB1) != AT91F_CAN_GetMessageDataHigh(&AT91C_BASE_CAN1->CAN_MB15) )
TRACE_ERROR("-E- Data Corrupted !\n\r");
}
///////////////////////////////////////////////////////////////////////////////////////////
TRACE_INFO("\n\r-----------------------------------------------------------\n\r");
TRACE_INFO("4. CAN0 Mailbox 3 asking for CAN1 Mailbox 3 transmission...\n\r");
TRACE_INFO("-----------------------------------------------------------\n\r");
TRACE_INFO("-- CAN0 Mailbox 3: Consumer Mailbox \n\r");
TRACE_INFO("-- CAN1 Mailbox 3: Producer Mailbox \n\r");
TRACE_INFO("-----------------------------------------------------------\n\r");
// Ask Transmissions on Mailbox 3 --> AT91C_CAN_MRDY raises for Mailbox 3 CAN_MB_SR ,發送傳輸請求
AT91F_CAN_InitTransferRequest(AT91C_BASE_CAN1,AT91C_CAN_MB3);
AT91F_CAN_InitTransferRequest(AT91C_BASE_CAN0,AT91C_CAN_MB3);
// Wait for Last Transmit Mailbox,等待發送結束
tick=0;
do {
status = AT91F_CAN_GetMessageStatus(&(AT91C_BASE_CAN0->CAN_MB3));
}
while( !(status & AT91C_CAN_MRDY) && (++tick<AT91C_CAN_TIMEOUT) ); //記錄超時次數
if (tick == AT91C_CAN_TIMEOUT) {
TRACE_ERROR("-E- Test FAILED !\n\r");
} else {
TRACE_INFO("-I- Tranfers Completed: CAN0 & CAN1 Mailboxes 3 MRDY flags have raised.\n\r");
if( AT91F_CAN_GetMessageDataLow(&AT91C_BASE_CAN0->CAN_MB3) != AT91F_CAN_GetMessageDataLow(&AT91C_BASE_CAN1->CAN_MB3) )
TRACE_ERROR("-E- Data Corrupted !\n\r");
if( AT91F_CAN_GetMessageDataHigh(&AT91C_BASE_CAN0->CAN_MB3) != AT91F_CAN_GetMessageDataHigh(&AT91C_BASE_CAN1->CAN_MB3) )
TRACE_ERROR("-E- Data Corrupted !\n\r");
}
///////////////////////////////////////////////////////////////////////////////////////////
TRACE_INFO("\n\rEnd of Tests\n\r");
return;
}
void CanSendData(unsigned int LData,unsigned HData)
{
unsigned int status;
unsigned int tick=0;
//配置郵箱
//AT91F_InitMailbox();
// AT91F_CAN_EnableIt(AT91C_BASE_CAN0,AT91C_CAN_MB0); 在此CAN0—MB0不接收數據,不用開中斷
AT91F_CAN_EnableIt(AT91C_BASE_CAN1,AT91C_CAN_MB0); // can1 為接收數據的郵箱 ,采用中斷接收
AT91F_CAN_CfgMessageDataLow (AT91C_BASE_CAN0_MB0,LData); //寫入要發送的數據低4位
AT91F_CAN_CfgMessageDataHigh(AT91C_BASE_CAN0_MB0,HData); //寫入要發送的數據高4位
//測試:將CAN0-MB0中的數據傳到CAN1-MB0中, 某一信箱發出數據,只會被相同ID的信箱接收
/* TRACE_INFO("\n\r---------------------------------------------------\n\r");
TRACE_INFO("1. CAN0 Mailbox 0 transmitting to CAN1 Mailbox 0...\n\r");
TRACE_INFO("---------------------------------------------------\n\r");
TRACE_INFO("-- CAN0 Mailbox 0: Tx Mailbox \n\r");
TRACE_INFO("-- CAN1 Mailbox 0: Rx Mailbox \n\r");
TRACE_INFO("---------------------------------------------------\n\r");
TRACE_INFO("-- CAN0 Mailbox 0: Tx Mailbox send data low 4 byte data is:");
int ttt=AT91F_CAN_GetMessageDataLow(&AT91C_BASE_CAN0->CAN_MB0) ;
TRACE_INFO("%d",ttt);
TRACE_INFO("\n\r-- CAN0 Mailbox 0: Tx Mailbox send data high 4 byte data is:");
ttt =AT91F_CAN_GetMessageDataHigh(&AT91C_BASE_CAN0->CAN_MB0) ;
TRACE_INFO("%d",ttt);
*/
AT91F_CAN_InitTransferRequest(AT91C_BASE_CAN0,AT91C_CAN_MB0); //請求發送
tick=0;
do {
status = AT91F_CAN_GetMessageStatus(&(AT91C_BASE_CAN0->CAN_MB0)) ; //waitting for send completed
} while( !(status & AT91C_CAN_MRDY) && (++tick<AT91C_CAN_TIMEOUT) );
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -