aboutsummaryrefslogtreecommitdiffhomepage
path: root/AT91SAM7S256/Source/c_comm.c
diff options
context:
space:
mode:
Diffstat (limited to 'AT91SAM7S256/Source/c_comm.c')
-rw-r--r--AT91SAM7S256/Source/c_comm.c42
1 files changed, 31 insertions, 11 deletions
diff --git a/AT91SAM7S256/Source/c_comm.c b/AT91SAM7S256/Source/c_comm.c
index c760b84..bdc747b 100644
--- a/AT91SAM7S256/Source/c_comm.c
+++ b/AT91SAM7S256/Source/c_comm.c
@@ -256,7 +256,11 @@ void cCommCtrl(void)
{
case HS_INITIALISE:
{
- dHiSpeedSetupUart(IOMapComm.HsSpeed, IOMapComm.HsMode);
+ // 0 == NORMAL mode (aka RS232 mode)
+ // 1 == RS485 mode
+ dHiSpeedSetupUart(IOMapComm.HsSpeed,
+ IOMapComm.HsMode & HS_MODE_MASK,
+ IOMapComm.HsMode & HS_UART_MASK ? 0 : 1);
IOMapComm.HsState = HS_INIT_RECEIVER;
IOMapComm.HsFlags |= HS_UPDATE;
}
@@ -266,13 +270,14 @@ void cCommCtrl(void)
{
dHiSpeedInitReceive(VarsComm.HsModuleInBuf.Buf);
VarsComm.HsState = 0x01;
+ IOMapComm.HsState = HS_DEFAULT;
}
break;
case HS_SEND_DATA:
{
cCommSendHiSpeedData();
- IOMapComm.HsState = HS_DEFAULT; // do not leave this in HS_SEND_DATA state
+ IOMapComm.HsState = HS_BYTES_REMAINING + IOMapComm.HsOutBuf.InPtr;
}
break;
@@ -280,6 +285,7 @@ void cCommCtrl(void)
{
VarsComm.HsState = 0x00;
dHiSpeedExit();
+ IOMapComm.HsState = HS_DEFAULT;
}
break;
@@ -287,11 +293,26 @@ void cCommCtrl(void)
{
if (VarsComm.HsState == 0)
dHiSpeedInit();
+ IOMapComm.HsState = HS_DEFAULT;
}
break;
}
}
+ // update the HsState if there are bytes remaining to be sent
+ if (IOMapComm.HsState >= HS_BYTES_REMAINING)
+ {
+ UWORD bts = 0;
+ dHiSpeedBytesToSend(&bts);
+ if (bts == 0)
+ {
+ IOMapComm.HsState = HS_DEFAULT;
+ IOMapComm.HsOutBuf.OutPtr = IOMapComm.HsOutBuf.InPtr;
+ }
+ else
+ IOMapComm.HsState = HS_BYTES_REMAINING + bts;
+ }
+
if (VarsComm.HsState != 0)
{
cCommReceivedHiSpeedData();
@@ -1497,12 +1518,10 @@ void cCommCopyFileName(UBYTE *pDst, UBYTE *pSrc)
void cCommSendHiSpeedData(void)
{
VarsComm.HsModuleOutBuf.OutPtr = 0;
- for (VarsComm.HsModuleOutBuf.InPtr = 0; VarsComm.HsModuleOutBuf.InPtr < IOMapComm.HsOutBuf.InPtr; VarsComm.HsModuleOutBuf.InPtr++)
- {
- VarsComm.HsModuleOutBuf.Buf[VarsComm.HsModuleOutBuf.InPtr] = IOMapComm.HsOutBuf.Buf[IOMapComm.HsOutBuf.OutPtr];
- IOMapComm.HsOutBuf.OutPtr++;
- }
- dHiSpeedSendData(VarsComm.HsModuleOutBuf.Buf, (VarsComm.HsModuleOutBuf.InPtr - VarsComm.HsModuleOutBuf.OutPtr));
+ memcpy(VarsComm.HsModuleOutBuf.Buf, IOMapComm.HsOutBuf.Buf, IOMapComm.HsOutBuf.InPtr);
+ VarsComm.HsModuleOutBuf.InPtr = IOMapComm.HsOutBuf.InPtr;
+ dHiSpeedSendData(VarsComm.HsModuleOutBuf.Buf, VarsComm.HsModuleOutBuf.InPtr);
+// IOMapComm.HsOutBuf.OutPtr = IOMapComm.HsOutBuf.InPtr;
}
void cCommReceivedHiSpeedData(void)
@@ -1522,7 +1541,7 @@ void cCommReceivedHiSpeedData(void)
{
IOMapComm.HsInBuf.Buf[IOMapComm.HsInBuf.InPtr] = VarsComm.HsModuleInBuf.Buf[Tmp];
IOMapComm.HsInBuf.InPtr++;
- if (IOMapComm.HsInBuf.InPtr > (SIZE_OF_HSBUF - 1))
+ if (IOMapComm.HsInBuf.InPtr >= SIZE_OF_HSBUF)
{
IOMapComm.HsInBuf.InPtr = 0;
}
@@ -1561,9 +1580,10 @@ void cCommReceivedHiSpeedData(void)
{
IOMapComm.HsOutBuf.Buf[0] = HS_ADDRESS_ALL; // reply is sent to "all"
IOMapComm.HsOutBuf.InPtr++;
- cCommSendHiSpeedData();
- IOMapComm.HsOutBuf.InPtr = 0;
IOMapComm.HsOutBuf.OutPtr = 0;
+ // send the data the next time cCommCtrl is called
+ IOMapComm.HsState = HS_SEND_DATA;
+ IOMapComm.HsFlags = HS_UPDATE;
}
}
}