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

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