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

📄 d_lowspeed.r

📁 乐高机器人的源码,开发平台是IAR_for_AVR.
💻 R
📖 第 1 页 / 共 3 页
字号:
//
// Date init       14.12.2004
//
// Revision date   $Date:: 19-09-06 15:05                                    $
//
// Filename        $Workfile:: d_lowspeed.r                                  $
//
// Version         $Revision:: 24                                            $
//
// Archive         $Archive:: /LMS2006/Sys01/Main/Firmware/Source/d_lowspeed $
//
// Platform        C
//

#ifdef    SAM7S256

#if       defined (PROTOTYPE_PCB_3) || (PROTOTYPE_PCB_4)

#define   CHANNEL_ONE_CLK				AT91C_PIO_PA23 /* PA23 is Clk */
#define   CHANNEL_ONE_DATA				AT91C_PIO_PA18 /* PA18 is Data */

#define   CHANNEL_TWO_CLK				AT91C_PIO_PA28 /* PA28 is Clk */
#define   CHANNEL_TWO_DATA				AT91C_PIO_PA19 /* PA19 is Data */

#define   CHANNEL_THREE_CLK				AT91C_PIO_PA29 /* PA29 is Clk */
#define   CHANNEL_THREE_DATA			AT91C_PIO_PA20 /* PA20 is Data */

#define   CHANNEL_FOUR_CLK				AT91C_PIO_PA30 /* PA30 is Clk */
#define   CHANNEL_FOUR_DATA				AT91C_PIO_PA2 /* PA2 is Data */

#else

#define   CHANNEL_ONE_CLK				AT91C_PIO_PA28 /* PA28 is Clk */
#define   CHANNEL_ONE_DATA				AT91C_PIO_PA20 /* PA20 is Data */

#endif

typedef   struct
{
  UWORD MaskBit;
  UBYTE ChannelState;
  UBYTE TxState;
  UBYTE RxState;
  UBYTE ReStartState;
  UBYTE TxByteCnt;
  UBYTE RxByteCnt;
  UBYTE *pComOutBuffer;
  UBYTE *pComInBuffer;
  UBYTE AckStatus;
  UBYTE RxBitCnt;
  UBYTE ReStartBit;
  UBYTE ComDeviceAddress;
  UBYTE RxWaitCnt;
}LOWSPEEDPARAMETERS;

static LOWSPEEDPARAMETERS LowSpeedData[4];

ULONG DATA_PINS[4] = {CHANNEL_ONE_DATA, CHANNEL_TWO_DATA, CHANNEL_THREE_DATA, CHANNEL_FOUR_DATA};
ULONG CLK_PINS[4] = {CHANNEL_ONE_CLK, CHANNEL_TWO_CLK, CHANNEL_THREE_CLK, CHANNEL_FOUR_CLK};

#define   LOWSPEED_CHANNEL1	 0
#define   LOWSPEED_CHANNEL2	 1
#define   LOWSPEED_CHANNEL3	 2
#define   LOWSPEED_CHANNEL4	 3
#define   NO_OF_LOWSPEED_COM_CHANNEL	4

#define   MASK_BIT_8		 0x80

#define   PIO_INQ            0x04

//Used for variable ChannelState
#define   LOWSPEED_IDLE		         0x00
#define   LOWSPEED_TX_STOP_BIT		 0x01
#define   LOWSPEED_TRANSMITTING      0x02
#define   LOWSPEED_RECEIVING		 0x04
#define   LOWSPEED_TEST_WAIT_STATE   0x08
#define   LOWSPEED_RESTART_CONDITION 0x10
#define   LOWSPEED_WAIT_BEFORE_RX    0x20

//Used for variable TxState
#define   TX_IDLE					 0x00
#define   TX_DATA_MORE_DATA			 0x01
#define   TX_DATA_CLK_HIGH           0x02
#define   TX_EVALUATE_ACK_CLK_HIGH   0x03
#define   TX_DATA_READ_ACK_CLK_LOW   0x04
#define   TX_DATA_CLK_LOW            0x05
#define   TX_ACK_EVALUATED_CLK_LOW   0x06

//Used for variable RxState
#define   RX_IDLE					 0x00
#define   RX_START_BIT_CLK_HIGH		 0x01
#define   RX_DATA_CLK_HIGH           0x02
#define   RX_ACK_TX_CLK_HIGH         0x03
#define   RX_DATA_CLK_LOW			 0x04
#define   RX_DONE_OR_NOT_CLK_LOW     0x05

//Used for variable ReStart
#define   RESTART_STATE_IDLE		 0x00
#define   RESTART_STATE_ONE			 0x01
#define   RESTART_STATE_TWO			 0x02
#define   RESTART_STATE_THREE   	 0x03
#define   RESTART_STATE_FOUR		 0x04
#define   RESTART_STATE_FIVE		 0x05
#define   RESTART_STATE_SIX 		 0x06
#define   RESTART_STATE_SEVEN		 0x07

#define   LOWSpeedTxInit                {\
                                          LowSpeedData[LOWSPEED_CHANNEL1].ChannelState = 0;\
                                          LowSpeedData[LOWSPEED_CHANNEL2].ChannelState = 0;\
                                          LowSpeedData[LOWSPEED_CHANNEL3].ChannelState = 0;\
                                          LowSpeedData[LOWSPEED_CHANNEL4].ChannelState = 0;\
                                        }

#define   LOWSpeedTimerInit             {\
                                          *AT91C_PMC_PCER       = 0x400;					/* Enable clock for PWM, PID10*/\
										  *AT91C_PWMC_MR	    = 0x01;						/* CLKA is output from prescaler */\
										  *AT91C_PWMC_MR	   |= 0x600;					/* Prescaler MCK divided with 64 */\
										  *AT91C_PWMC_CH0_CMR   = 0x06;						/* Channel 0 uses MCK divided by 64 */\
										  *AT91C_PWMC_CH0_CMR  &= 0xFFFFFEFF;				/* Left alignment on periode */\
										  *AT91C_PWMC_CH0_CPRDR = 0x20;						/* Set to 39 => 52uSecondes interrupt */\
										  *AT91C_PWMC_IDR	    = AT91C_PWMC_CHID0;			/* Disable interrupt for PWM output channel 0 */\
										  *AT91C_AIC_IDCR       = 0x400;					/* Disable AIC intterupt on ID10 PWM */\
                                           AT91C_AIC_SVR[10]    = (unsigned int)LowSpeedPwmIrqHandler;\
                                           AT91C_AIC_SMR[10]    = 0x01;						/* Enable trigger on level */\
                                          *AT91C_AIC_ICCR       = 0x400;					/* Clear interrupt register PID10*/\
										  *AT91C_PWMC_IER		= AT91C_PWMC_CHID0;			/* Enable interrupt for PWM output channel 0 */\
										  *AT91C_AIC_IECR       = 0x400;					/* Enable interrupt from PWM */\
										}

#define   LOWSpeedExit

#define   ENABLEDebugOutput				{\
                                          *AT91C_PIOA_PER   = AT91C_PIO_PA29; /* Enable PIO on PA029 */\
                                          *AT91C_PIOA_OER   = AT91C_PIO_PA29; /* PA029 set to Output  */\
                                          *AT91C_PIOA_CODR	= 0x20000000;\
                                        }

#define   SETDebugOutputHigh			*AT91C_PIOA_SODR	= 0x20000000

#define   SETDebugOutputLow				*AT91C_PIOA_CODR	= 0x20000000


#define	  SETClkComOneHigh				*AT91C_PIOA_SODR	= CHANNEL_ONE_CLK

#define	  SETClkComOneLow				*AT91C_PIOA_CODR	= CHANNEL_ONE_CLK

#define   GetClkComOnePinLevel			*AT91C_PIOA_PDSR	& CHANNEL_ONE_CLK

#define	  SETClkComTwoHigh				*AT91C_PIOA_SODR	= CHANNEL_TWO_CLK

#define	  SETClkComTwoLow				*AT91C_PIOA_CODR	= CHANNEL_TWO_CLK

#define   GetClkComTwoPinLevel			*AT91C_PIOA_PDSR	& CHANNEL_TWO_CLK

#define	  SETClkComThreeHigh			*AT91C_PIOA_SODR	= CHANNEL_THREE_CLK

#define	  SETClkComThreeLow				*AT91C_PIOA_CODR	= CHANNEL_THREE_CLK

#define   GetClkComThreePinLevel		*AT91C_PIOA_PDSR	& CHANNEL_THREE_CLK

#define	  SETClkComFourHigh				*AT91C_PIOA_SODR	= CHANNEL_FOUR_CLK

#define	  SETClkComFourLow				*AT91C_PIOA_CODR	= CHANNEL_FOUR_CLK

#define   GetClkComFourPinLevel			*AT91C_PIOA_PDSR	& CHANNEL_FOUR_CLK


#define	  SETDataComOneHigh				*AT91C_PIOA_SODR	= CHANNEL_ONE_DATA

#define   SETDataComOneLow				*AT91C_PIOA_CODR	= CHANNEL_ONE_DATA

#define   GetDataComOnePinLevel			*AT91C_PIOA_PDSR	& CHANNEL_ONE_DATA

#define   GETDataComOnePinDirection		*AT91C_PIOA_OSR     & CHANNEL_ONE_DATA

#define	  SETDataComTwoHigh				*AT91C_PIOA_SODR	= CHANNEL_TWO_DATA

#define   SETDataComTwoLow				*AT91C_PIOA_CODR	= CHANNEL_TWO_DATA

#define   GetDataComTwoPinLevel			*AT91C_PIOA_PDSR	& CHANNEL_TWO_DATA

#define   GETDataComTwoPinDirection		*AT91C_PIOA_OSR     & CHANNEL_TWO_DATA

#define	  SETDataComThreeHigh			*AT91C_PIOA_SODR	= CHANNEL_THREE_DATA

#define   SETDataComThreeLow			*AT91C_PIOA_CODR	= CHANNEL_THREE_DATA

#define   GetDataComThreePinLevel		*AT91C_PIOA_PDSR	& CHANNEL_THREE_DATA

#define   GETDataComThreePinDirection	*AT91C_PIOA_OSR     & CHANNEL_THREE_DATA

#define	  SETDataComFourHigh			*AT91C_PIOA_SODR	= CHANNEL_FOUR_DATA

#define   SETDataComFourLow				*AT91C_PIOA_CODR	= CHANNEL_FOUR_DATA

#define   GetDataComFourPinLevel		*AT91C_PIOA_PDSR	& CHANNEL_FOUR_DATA

#define   GETDataComFourPinDirection	*AT91C_PIOA_OSR     & CHANNEL_FOUR_DATA

#define   SETDataComOneToInput          *AT91C_PIOA_ODR     = CHANNEL_ONE_DATA;

#define   SETDataComOneToOutput			*AT91C_PIOA_OER     = CHANNEL_ONE_DATA;

#define   SETDataComTwoToInput          *AT91C_PIOA_ODR     = CHANNEL_TWO_DATA;

#define   SETDataComTwoToOutput			*AT91C_PIOA_OER     = CHANNEL_TWO_DATA;

#define   SETDataComThreeToInput        *AT91C_PIOA_ODR     = CHANNEL_THREE_DATA;

#define   SETDataComThreeToOutput		*AT91C_PIOA_OER     = CHANNEL_THREE_DATA;

#define   SETDataComFourToInput         *AT91C_PIOA_ODR     = CHANNEL_FOUR_DATA;

#define   SETDataComFourToOutput		*AT91C_PIOA_OER     = CHANNEL_FOUR_DATA;

#define   DISABLEPullupDataComOne		*AT91C_PIOA_PPUDR   = CHANNEL_ONE_DATA;

#define   DISABLEPullupClkComOne		*AT91C_PIOA_PPUDR   = CHANNEL_ONE_CLK;

#define   DISABLEPullupDataComTwo		*AT91C_PIOA_PPUDR   = CHANNEL_TWO_DATA;

#define   DISABLEPullupClkComTwo		*AT91C_PIOA_PPUDR   = CHANNEL_TWO_CLK;

#define   DISABLEPullupDataComThree		*AT91C_PIOA_PPUDR   = CHANNEL_THREE_DATA;

#define   DISABLEPullupClkComThree		*AT91C_PIOA_PPUDR   = CHANNEL_THREE_CLK;

#define   DISABLEPullupDataComFour		*AT91C_PIOA_PPUDR   = CHANNEL_FOUR_DATA;

#define   DISABLEPullupClkComFour		*AT91C_PIOA_PPUDR   = CHANNEL_FOUR_CLK;

#define   ENABLEPullupDataComOne		*AT91C_PIOA_PPUER   = CHANNEL_ONE_DATA;

#define   ENABLEPullupClkComOne 		*AT91C_PIOA_PPUER   = CHANNEL_ONE_CLK;

#define   ENABLEPullupDataComTwo		*AT91C_PIOA_PPUER   = CHANNEL_TWO_DATA;

#define   ENABLEPullupClkComTwo 		*AT91C_PIOA_PPUER   = CHANNEL_TWO_CLK;

#define   ENABLEPullupDataComThree		*AT91C_PIOA_PPUER   = CHANNEL_THREE_DATA;

#define   ENABLEPullupClkComThree		*AT91C_PIOA_PPUER   = CHANNEL_THREE_CLK;

#define   ENABLEPullupDataComFour		*AT91C_PIOA_PPUER   = CHANNEL_FOUR_DATA;

#define   ENABLEPullupClkComFour		*AT91C_PIOA_PPUER   = CHANNEL_FOUR_CLK;

#define SETClkLow(ChannelNr)             {\
										   if (ChannelNr == 0)\
										   {\
										     SETClkComOneLow;\
										   }\
										   else\
										   {\
										     if (ChannelNr == 1)\
										     {\
										       SETClkComTwoLow;\
										     }\
										     else\
										     {\
										       if (ChannelNr == 2)\
										       {\
										         SETClkComThreeLow;\
										       }\
										       else\
										       {\
										         if (ChannelNr == 3)\
										         {\
										           SETClkComFourLow;\
										         }\
										       }\
										     }\
										   }\
                                         }


#define SETClkHigh(ChannelNr)            {\
										   if (ChannelNr == 0)\
										   {\
										     SETClkComOneHigh;\
										   }\
										   else\
										   {\
										     if (ChannelNr == 1)\
										     {\
										       SETClkComTwoHigh;\
										     }\
										     else\
										     {\
										       if (ChannelNr == 2)\
										       {\
										         SETClkComThreeHigh;\
										       }\
										       else\
										       {\
										         if (ChannelNr == 3)\
										         {\
										           SETClkComFourHigh;\
										         }\
										       }\
										     }\
										   }\
                                         }

#define SETDataLow(ChannelNr)            {\
										   if (ChannelNr == 0)\
										   {\
										     SETDataComOneLow;\
										   }\
										   else\
										   {\

⌨️ 快捷键说明

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