📄 main.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 + -