📄 d_lowspeed.r
字号:
if (ChannelNr == 1)\
{\
SETDataComTwoLow;\
}\
else\
{\
if (ChannelNr == 2)\
{\
SETDataComThreeLow;\
}\
else\
{\
if (ChannelNr == 3)\
{\
SETDataComFourLow;\
}\
}\
}\
}\
}
#define SETDataHigh(ChannelNr) {\
if (ChannelNr == 0)\
{\
SETDataComOneHigh;\
}\
else\
{\
if (ChannelNr == 1)\
{\
SETDataComTwoHigh;\
}\
else\
{\
if (ChannelNr == 2)\
{\
SETDataComThreeHigh;\
}\
else\
{\
if (ChannelNr == 3)\
{\
SETDataComFourHigh;\
}\
}\
}\
}\
}
#define SETDataToInput(ChannelNr) {\
if (ChannelNr == 0)\
{\
SETDataComOneToInput;\
}\
else\
{\
if (ChannelNr == 1)\
{\
SETDataComTwoToInput;\
}\
else\
{\
if (ChannelNr == 2)\
{\
SETDataComThreeToInput;\
}\
else\
{\
if (ChannelNr == 3)\
{\
SETDataComFourToInput;\
}\
}\
}\
}\
}
#define SETDataToOutput(ChannelNr) {\
if (ChannelNr == 0)\
{\
SETDataComOneToOutput;\
}\
else\
{\
if (ChannelNr == 1)\
{\
SETDataComTwoToOutput;\
}\
else\
{\
if (ChannelNr == 2)\
{\
SETDataComThreeToOutput;\
}\
else\
{\
if (ChannelNr == 3)\
{\
SETDataComFourToOutput;\
}\
}\
}\
}\
}
#define ENABLEPWMTimerForLowCom {\
*AT91C_PWMC_ENA = AT91C_PWMC_CHID0; /* Enable PWM output channel 0 */\
}
#define DISABLEPWMTimerForLowCom {\
*AT91C_PWMC_DIS = AT91C_PWMC_CHID0; /* Disable PWM output channel 0 */\
}
#define OLD_DISABLEPWMTimerForLowCom {\
*AT91C_PWMC_DIS = AT91C_PWMC_CHID0; /* Disable PWM output channel 0 */\
*AT91C_PWMC_IDR = AT91C_PWMC_CHID0; /* Disable interrupt from PWM output channel 0 */\
*AT91C_AIC_IDCR = 0x400; /* Disable Irq from PID10 */\
*AT91C_AIC_ICCR = 0x400; /* Clear interrupt register PID10*/\
*AT91C_PMC_PCDR = 0x400; /* Disable clock for PWM, PID10*/\
}
__ramfunc void LowSpeedPwmIrqHandler(void)
{
ULONG TestVar;
ULONG PinStatus;
UBYTE ChannelNr;
TestVar = *AT91C_PWMC_ISR;
TestVar = TestVar;
PinStatus = *AT91C_PIOA_PDSR;
for (ChannelNr = 0; ChannelNr < NO_OF_LOWSPEED_COM_CHANNEL; ChannelNr++)
{
switch(LowSpeedData[ChannelNr].ChannelState)
{
case LOWSPEED_IDLE:
{
}
break;
case LOWSPEED_TX_STOP_BIT:
{
SETDataHigh(ChannelNr);
LowSpeedData[ChannelNr].ChannelState = LOWSPEED_IDLE; //Now we have send a STOP sequence, disable this channel
}
break;
case LOWSPEED_TRANSMITTING:
{
switch(LowSpeedData[ChannelNr].TxState)
{
case TX_DATA_MORE_DATA:
{
PinStatus |= CLK_PINS[ChannelNr];
LowSpeedData[ChannelNr].TxState = TX_DATA_CLK_HIGH;
}
break;
case TX_DATA_CLK_HIGH:
{
SETClkLow(ChannelNr);
if (LowSpeedData[ChannelNr].MaskBit == 0) //Is Byte Done, then we need a ack from receiver
{
SETDataToInput(ChannelNr); //Set datapin to input
LowSpeedData[ChannelNr].TxState = TX_DATA_READ_ACK_CLK_LOW;
}
else
{
if (*LowSpeedData[ChannelNr].pComOutBuffer & LowSpeedData[ChannelNr].MaskBit) //Setup data pin in relation to the data
{
SETDataHigh(ChannelNr); //Set data output high
}
else
{
SETDataLow(ChannelNr); //Set data output low
}
LowSpeedData[ChannelNr].TxState = TX_DATA_CLK_LOW;
}
}
break;
case TX_EVALUATE_ACK_CLK_HIGH:
{
SETClkLow(ChannelNr);
if (LowSpeedData[ChannelNr].AckStatus == 1)
{
LowSpeedData[ChannelNr].TxByteCnt--;
if (LowSpeedData[ChannelNr].TxByteCnt > 0) //Here initialise to send next byte
{
LowSpeedData[ChannelNr].MaskBit = MASK_BIT_8;
LowSpeedData[ChannelNr].pComOutBuffer++;
}
LowSpeedData[ChannelNr].TxState = TX_ACK_EVALUATED_CLK_LOW; //Received ack, now make a stop sequence or send next byte
}
else
{ //Data communication error !
LowSpeedData[ChannelNr].TxByteCnt = 0;
SETClkHigh(ChannelNr);
LowSpeedData[ChannelNr].ChannelState = LOWSPEED_TX_STOP_BIT; //Received ack, now make a stop sequence or send next byte.
}
}
break;
case TX_DATA_READ_ACK_CLK_LOW:
{
if (!(PinStatus & DATA_PINS[ChannelNr]))
{
LowSpeedData[ChannelNr].AckStatus = 1; //Read ack signal from receiver
}
SETDataToOutput(ChannelNr);
SETDataLow(ChannelNr);
LowSpeedData[ChannelNr].TxState = TX_EVALUATE_ACK_CLK_HIGH;
SETClkHigh(ChannelNr);
}
break;
case TX_DATA_CLK_LOW:
{
LowSpeedData[ChannelNr].MaskBit = LowSpeedData[ChannelNr].MaskBit >> 1; //Get ready for the next bit which should be clk out next time
SETClkHigh(ChannelNr); //Clk goes high = The reciever reads the data
LowSpeedData[ChannelNr].TxState = TX_DATA_CLK_HIGH;
}
break;
case TX_ACK_EVALUATED_CLK_LOW:
{
if (LowSpeedData[ChannelNr].MaskBit != 0)
{
LowSpeedData[ChannelNr].TxState = TX_DATA_MORE_DATA;
}
else
{
if (LowSpeedData[ChannelNr].ReStartBit != 0)
{
LowSpeedData[ChannelNr].ChannelState = LOWSPEED_RESTART_CONDITION;
LowSpeedData[ChannelNr].ReStartState = RESTART_STATE_ONE;
SETDataLow(ChannelNr);
SETClkHigh(ChannelNr); //Clk goes high = The reciever reads the data
}
else
{
if (LowSpeedData[ChannelNr].RxByteCnt != 0)
{
LowSpeedData[ChannelNr].ChannelState = LOWSPEED_WAIT_BEFORE_RX;
}
else
{
LowSpeedData[ChannelNr].ChannelState = LOWSPEED_TX_STOP_BIT;
SETClkHigh(ChannelNr); //Clk goes high = The reciever reads the data
}
}
LowSpeedData[ChannelNr].TxState = TX_IDLE;
}
}
break;
}
}
break;
case LOWSPEED_RESTART_CONDITION:
{
switch(LowSpeedData[ChannelNr].ReStartState)
{
case RESTART_STATE_ONE:
{
LowSpeedData[ChannelNr].ReStartState = RESTART_STATE_TWO;
}
break;
case RESTART_STATE_TWO:
{
SETDataHigh(ChannelNr);
LowSpeedData[ChannelNr].ReStartState = RESTART_STATE_THREE;
}
break;
case RESTART_STATE_THREE:
{
SETClkLow(ChannelNr);
LowSpeedData[ChannelNr].ReStartState = RESTART_STATE_FOUR;
}
break;
case RESTART_STATE_FOUR:
{
SETClkHigh(ChannelNr);
LowSpeedData[ChannelNr].ReStartState = RESTART_STATE_FIVE;
}
break;
case RESTART_STATE_FIVE:
{
SETDataLow(ChannelNr);
LowSpeedData[ChannelNr].ReStartState = RESTART_STATE_SIX;
}
break;
case RESTART_STATE_SIX:
{
LowSpeedData[ChannelNr].ReStartState = RESTART_STATE_SEVEN;
}
break;
case RESTART_STATE_SEVEN:
{
SETClkLow(ChannelNr);
LowSpeedData[ChannelNr].ReStartState = RESTART_STATE_IDLE;
LowSpeedData[ChannelNr].ReStartBit = 0;
LowSpeedData[ChannelNr].pComOutBuffer = &LowSpeedData[ChannelNr].ComDeviceAddress;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -