?? 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 02-Sep-2005
// ----------------------------------------------------------------------------
#include "main.h"
/* Global variables */
volatile char testCAN0 = AT91C_TEST_NOK;
volatile char testCAN1 = AT91C_TEST_NOK;
extern void CanSendData(unsigned int LData,unsigned HData) ;
//*----------------------------------------------------------------------------
//* \fn AT91F_CAN0_Handler
//* \brief
//*----------------------------------------------------------------------------
void AT91F_CAN0_Handler(void)
{
volatile unsigned int status;
status = AT91F_CAN_GetStatus(AT91C_BASE_CAN0) & AT91F_CAN_GetInterruptMaskStatus(AT91C_BASE_CAN0);
AT91F_CAN_DisableIt(AT91C_BASE_CAN0,status);
int RxData=AT91F_CAN_GetMessageDataLow(&AT91C_BASE_CAN0->CAN_MB0) ;
TRACE_INFO("______Interrupt now is received some data____________") ;
TRACE_INFO("%d",RxData);
if(status & AT91C_CAN_WAKEUP) {
testCAN0 = AT91C_TEST_OK;
TRACE_DEBUG_H("=> CAN0 WAKEUP ");
}
}
//*----------------------------------------------------------------------------
//* \fn AT91F_CAN1_Handler
//* \brief
//*----------------------------------------------------------------------------
void AT91F_CAN1_Handler(void) //接收CAN0 ->MB0 發送的數據
{
volatile unsigned int status;
int RxData ;
status = AT91F_CAN_GetStatus(AT91C_BASE_CAN1) & AT91F_CAN_GetInterruptMaskStatus(AT91C_BASE_CAN1);
AT91F_CAN_DisableIt(AT91C_BASE_CAN1,status);
/* RxData=AT91F_CAN_GetMessageDataLow(&AT91C_BASE_CAN1->CAN_MB0) ; //接收低四位
TRACE_INFO("\r\nCAN1-MailBox0_______Interrupt received data,Low is:") ;
TRACE_INFO("%d",RxData );
RxData=AT91F_CAN_GetMessageDataHigh(&AT91C_BASE_CAN1->CAN_MB0) ; //接收高四位
TRACE_INFO("\r\nCAN1-MailBox0_______Interrupt received data,High is:") ;
TRACE_INFO("%d",RxData );
*/
RxData=AT91F_CAN_GetMessageDataHigh(&AT91C_BASE_CAN1->CAN_MB0) ;
TRACE_INFO("%d",RxData );
TRACE_INFO("\r\n");
if((AT91F_CAN_GetMessageDataLow(&AT91C_BASE_CAN1->CAN_MB0)!=AT91F_CAN_GetMessageDataLow(&AT91C_BASE_CAN0->CAN_MB0))
|(AT91F_CAN_GetMessageDataHigh(&AT91C_BASE_CAN1->CAN_MB0)!=AT91F_CAN_GetMessageDataHigh(&AT91C_BASE_CAN0->CAN_MB0)))
TRACE_INFO("\r\n*********************ERROR**************************************") ;
/**如果如下指令不執行的話,所有讀出的數據都將是第一次接收到的數據**/
AT91C_BASE_CAN1_MB0->CAN_MB_MCR=AT91C_CAN_MTCR & (0x1<<23); //允許接收下一條消息
/*******************************************************************/
if((status & AT91C_CAN_WAKEUP) == AT91C_CAN_WAKEUP) {
testCAN1 = AT91C_TEST_OK;
TRACE_DEBUG_H("=> CAN1 WAKEUP ");
}
}
//*--------------------------------------------------------------------------------------
//* 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("AT91SAM7A3 Basic CAN Test\n\r");
TRACE_INFO("======================================\n\r");
///////////////////////////////////////////////////////////////////////////////////////////
// Init CAN0 and CAN1
///////////////////////////////////////////////////////////////////////////////////////////
// Enable CAN0 and CAN1 PIOs
AT91F_CAN0_CfgPIO();
AT91F_CAN1_CfgPIO();
// Enable CAN0 and CAN1 Clocks
AT91F_CAN0_CfgPMC();
AT91F_CAN1_CfgPMC();
// Enable CANs Transceivers
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 CAN0 Interrupt Source Level
AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, // CAN0 base address
AT91C_ID_CAN0, // CAN0 ID
AT91C_AIC_PRIOR_HIGHEST, // Max priority
AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, // Level sensitive
AT91F_CAN0_Handler); // C Handler
AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_CAN0);
// Init CAN1 Interrupt Source Level
AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, // CAN1 base address
AT91C_ID_CAN1, // CAN1 ID
AT91C_AIC_PRIOR_HIGHEST, // Max priority
AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, // Level sensitive
AT91F_CAN1_Handler); // C Handler
AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_CAN1); //AIC中斷允許
// 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_CAN0,0x00ff3066); //config 1D3066= 100K,相互通訊的兩個CAN的撥特率必須相同
AT91F_CAN_CfgBaudrateReg(AT91C_BASE_CAN1,0x00ff3066); //0x007c3066=24k 。1M 時,BR=0x00023544 ;
///////////////////////////////////////////////////////////////////////////////////////////
// Enter Main Application
///////////////////////////////////////////////////////////////////////////////////////////
AT91F_BasicTestSuite(); //進行一次測試
for(;;)
{
/**以100K的速率由 CAN0->Mailbox0 向 Can1->Mailbox0 發送數據**/
/* for(int n=0;n<=32767;) //減慢發送速度,以使超級終端顯示的數據讓人眼睛看起來不閃爍
for(int i=0;i<=30000;i++)
for(int j=0;j<=100;j++)
n++ ;
*/
static int datas=1 ;
if(datas>=32767)
datas=1 ;
CanSendData((unsigned)(0x100),(unsigned)datas++) ;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -