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

📄 can.c

📁 atmel官方的at91sam7x256芯片在iar编译环境下的全部演示代码
💻 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 Mailboxes
//*----------------------------------------------------------------------------
void AT91F_InitMailbox(void)
{
  // Init CAN Mailbox 0
  AT91F_InitMailboxRegisters(AT91C_BASE_CAN_MB0,
                             AT91C_CAN_MOT_TX | AT91C_CAN_PRIOR,                    // Mailbox Mode Reg
                             0x00000000,                                            // Mailbox Acceptance Mask Reg
                             AT91C_CAN_MIDvA & (0x07<<18),	                        // Mailbox ID Reg
                             0x11223344,                                            // Mailbox Data Low Reg
                             0x01234567,                                            // Mailbox Data High Reg
                             (AT91C_CAN_MDLC & (0x8<<16)) );                        // Mailbox Control Reg

  // Init CANMailbox 1
  AT91F_InitMailboxRegisters(AT91C_BASE_CAN_MB1,
                             AT91C_CAN_MOT_RX | AT91C_CAN_PRIOR,                    // Mailbox Mode Reg
                             AT91C_CAN_MIDvA | AT91C_CAN_MIDvB | AT91C_CAN_MIDE,    // Mailbox Acceptance Mask Reg
                             AT91C_CAN_MIDvA & (0x07<<18),	                        // Mailbox ID Reg
                             0x00000000,                                            // Mailbox Data Low Reg
                             0x00000000,                                            // Mailbox Data High Reg
                             0x00000000);                                           // Mailbox Control Reg
}

//*----------------------------------------------------------------------------
//* \fn    AT91F_BasicTestSuite
//* \brief
//*----------------------------------------------------------------------------
void AT91F_BasicTestSuite(void)
{
  unsigned int tick=0;

  ///////////////////////////////////////////////////////////////////////////////////////////
  TRACE_INFO("\n\r--------------------------------------------------\n\r");
  TRACE_INFO("1. Wait for CAN Controller Bus Synchronization...\n\r");
  TRACE_INFO("--------------------------------------------------");

  // Enable CAN and Wait for WakeUp Interrupt
  AT91F_CAN_EnableIt(AT91C_BASE_CAN,AT91C_CAN_WAKEUP);
  AT91F_CAN_CfgModeReg(AT91C_BASE_CAN,AT91C_CAN_CANEN);

  // Wait for WAKEUP flag raising <=> 11-recessive-bit were scanned by the transceiver
  while( (testCAN != AT91C_TEST_OK) && (++tick < AT91C_CAN_TIMEOUT) ) ;
  testCAN=AT91C_TEST_NOK;

  if (tick >= AT91C_CAN_TIMEOUT) {
    TRACE_ERROR("\n\r-E- CAN Initialisation FAILED !\n\r");
  } else {
    TRACE_INFO("\n\r-I- CAN Initialisation Completed !\n\r");
  }

  ///////////////////////////////////////////////////////////////////////////////////////////
  TRACE_INFO("\n\r---------------------------------------------------\n\r");
  TRACE_INFO("2. Try to send or receive CAN messages...\n\r");
  TRACE_INFO("---------------------------------------------------\n\r");
  TRACE_INFO("-- CAN Mailbox 0: Tx Mailbox \n\r");
  TRACE_INFO("-- CAN Mailbox 1: Rx Mailbox \n\r");
  TRACE_INFO("---------------------------------------------------\n\r");

  // Configure Mailboxes
  AT91F_InitMailbox();

  // Enable Reception on Mailbox 1
  AT91F_CAN_InitTransferRequest(AT91C_BASE_CAN,AT91C_CAN_MB1);
  // Enable Reception Mailbox 1 interrupt
  AT91F_CAN_EnableIt(AT91C_BASE_CAN,AT91C_CAN_MB1);

  for (;;) {
    // Ask Transmission on Mailbox 0
    AT91F_CAN_InitTransferRequest(AT91C_BASE_CAN,AT91C_CAN_MB0);
    // Enable Transmission Mailbox 0 interrupt
    AT91F_CAN_EnableIt(AT91C_BASE_CAN,AT91C_CAN_MB0);

    // Wait for Reception on Mailbox 1
    while(testCAN!=AT91C_TEST_OK);
    testCAN = AT91C_TEST_NOK;
    TRACE_INFO("\n\rTx messages:%u , Rx messages:%u\n\r",txcounter,rxcounter);
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -