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

📄 main.c

📁 英贝德 sam7x256 开发板 所有源码程序
💻 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           : main.c
//  Object              : main application written in C
//  Creation            : FBr   06-Sep-2005
// ----------------------------------------------------------------------------

#include "main.h"

/* Global variables */
volatile char           testCAN = AT91C_TEST_NOK;
unsigned int            txcounter,rxcounter;

//*----------------------------------------------------------------------------
//* \fn    AT91F_CAN_Handler
//* \brief
//*----------------------------------------------------------------------------
void AT91F_CAN_Handler(void)
{
  volatile unsigned int status;
		
  status = AT91F_CAN_GetStatus(AT91C_BASE_CAN) & AT91F_CAN_GetInterruptMaskStatus(AT91C_BASE_CAN);
  AT91F_CAN_DisableIt(AT91C_BASE_CAN,status);

  if(status & AT91C_CAN_WAKEUP) {
    testCAN = AT91C_TEST_OK;
    TRACE_DEBUG_H("\n\r=> CAN WAKEUP ");
  }

  if(status & AT91C_CAN_MB0) {
    txcounter++;
    // Enable Reception on Mailbox 1
    AT91F_CAN_InitTransferRequest(AT91C_BASE_CAN,AT91C_CAN_MB1);
    // Enable Mailbox 1 interrupt
    AT91F_CAN_EnableIt(AT91C_BASE_CAN,AT91C_CAN_MB1);
    TRACE_DEBUG_H("\n\r=> CAN MB0 Interrupt");
  }

  if(status & AT91C_CAN_MB1) {
    testCAN = AT91C_TEST_OK;
    rxcounter++;
    TRACE_DEBUG_H("\n\r=> CAN MB1 Interrupt");
  }
}

//*--------------------------------------------------------------------------------------
//* Function Name       : Main
//* Object              : Software entry point
//*--------------------------------------------------------------------------------------
void main()
{
  ////////////////////////////////////////////////////////////////////////////////////////////////////
  //  DBGU Init
  /////////////////////////////////////////////////////////////////////////////////////////////////////

  // Enable DBGU Clock
  //AT91F_DBGU_CfgPMC();  // DBGU is always clocked
  // Open PIO for DBGU
  AT91F_DBGU_CfgPIO();
  AT91F_US_Configure ((AT91PS_USART) AT91C_BASE_DBGU,
                      AT91C_MASTER_CLOCK,
                      AT91C_US_ASYNC_MODE,  	// mode Register to be programmed
                      AT91C_BAUDRATE_115200,	// baudrate to be programmed
                      0);                   	// timeguard to be programmed
  // Enable Transmitter
  AT91F_US_EnableTx((AT91PS_USART) AT91C_BASE_DBGU);

  TRACE_INFO("\n\n\r======================================\n\r");
  TRACE_INFO("AT91SAMX Basic CAN\n\r");
  TRACE_INFO("======================================\n\r");

  ///////////////////////////////////////////////////////////////////////////////////////////
  //  Init CAN
  ///////////////////////////////////////////////////////////////////////////////////////////

  // Enable CAN PIOs
  AT91F_CAN_CfgPIO();
  // Enable CAN Clock
  AT91F_CAN_CfgPMC();

  // Enable CAN Transceiver
  AT91F_PIOA_CfgPMC();
  AT91F_PIO_CfgOutput(AT91C_BASE_PIOA,AT91B_CAN_TRANSCEIVER_RS) ;
  // Clear PA23 <=> Enable Transceiver Normal Mode (versus Standby mode)
  AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,AT91B_CAN_TRANSCEIVER_RS) ;

  // Init CAN Interrupt Source Level
  AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,                        	// CAN base address
                        AT91C_ID_CAN,                         	// CAN ID
                        AT91C_AIC_PRIOR_HIGHEST,               	// Max priority
                        AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, 	    // Level sensitive
                        AT91F_CAN_Handler);                     // C Handler

  AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_CAN);

  // Cfg CAN Baudrate to 1Mbit/s => BRP = 5
  // We choose 8 Time Quanta (tCSC = 125ns): 8tCSC = tSYNC + tPRS + tPHS1 + tPHS2
  // Cfg PHASE1 PHASE2 PROPAG and SYNC segment
  // Delay of busdriver + delay of receiver circuit = 200ns
  // Delay of bus line considered negligible = 0ns
  // tPRS = 2*(200+0) = 400ns < 4tCSC => PROPAG = 3
  // tSYNC = 1tCSC =>  8tCSC = 1tCSC + 4tCSC + tPHS1 + tPHS2
  // tPHS1 + tPHS2 = 3tCSC => Phase Segment 2 = Max(IPT=2TQ,Phase Segment 1) = 2TQ => PHASE2 = 2-1 = 1 => PHASE1 = 0
  // tSJW = Min(4 TQ, Phase Segment 1) = 1TQ => SJW = 1-1 = 0
  AT91F_CAN_CfgBaudrateReg(AT91C_BASE_CAN,0x00050301);

  ///////////////////////////////////////////////////////////////////////////////////////////
  //  Enter Main Application
  ///////////////////////////////////////////////////////////////////////////////////////////

  AT91F_BasicTestSuite();
}

⌨️ 快捷键说明

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