⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 can.c

📁 Atmel arm 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 + -