📄 bus.c
字号:
#include "stdlib.h"
#include "config.h"
#include "regmap.h"
#include "bufloc.h"
#include "global.h"
#include "memmap.h"
#include "sio.h"
#include "gpio.h"
#include "func.h"
#include "util.h"
#include "ircmd.h"
#ifdef SUPPORT_BUS_DEVICE
/************************************************************************
* BUS Interface Define *
************************************************************************/
#define BUS_STB 17
#define BUS_DAT 16
#define BUS_ACK 15
#define BUS_STB_HIGH (GPIO_E_SET(BUS_STB, 0))
#define BUS_DAT_HIGH (GPIO_E_SET(BUS_DAT, 0))
#define BUS_ACK_HIGH (GPIO_E_SET(BUS_ACK, 0))
#define BUS_STB_LOW (GPIO_O_SET(BUS_STB, 0)); (GPIO_E_SET(BUS_STB, 1))
#define BUS_DAT_LOW (GPIO_O_SET(BUS_DAT, 0)); (GPIO_E_SET(BUS_DAT, 1))
#define BUS_ACK_LOW (GPIO_O_SET(BUS_ACK, 0)); (GPIO_E_SET(BUS_ACK, 1))
#define BUS_STB_READ (GPIO_I_GET(BUS_STB))
#define BUS_DAT_READ (GPIO_I_GET(BUS_DAT))
#define BUS_ACK_READ (GPIO_I_GET(BUS_ACK))
/************************************************************************
* BUS Bus Variabler *
************************************************************************/
#define FIFO_SEND_FI(d) *(BUSSendFIFO + (BUSSendFI++)) = (d)
#define FIFO_SEND_FO(d) (d) = *(BUSSendFIFO + (BUSSendFO++))
#define FIFO_SEND_FO_BACK(d) *(BUSSendFIFO + (--BUSSendFO)) = (d)
#define FIFO_RECV_FI(d) *(BUSRecvFIFO + (BUSRecvFI++)) = (d)
#define FIFO_RECV_FO(d) (d) = *(BUSRecvFIFO + (BUSRecvFO++))
#define FIFO_SEND_EMPTY (BUSSendFI == BUSSendFO)
#define FIFO_RECV_EMPTY (BUSRecvFI == BUSRecvFO)
#define FIFO_SEND_FULL ((BUSSendFI + 1) == BUSSendFO)
#define FIFO_RECV_FULL ((BUSRecvFI + 1) == BUSRecvFO)
/************************************************************************
* Init BUS Subroutine *
************************************************************************/
void InitBUSVar()
{
BUSRecvFlag = FALSE;
}
/************************************************************************
* BUS Subroutine *
************************************************************************/
void FinishBUS()
{
BUS_STB_HIGH;
BUS_DAT_HIGH;
BUS_ACK_HIGH;
BUSStep = 0;
BUSBitCount = 0;
BUSTryCount = 10;
BUSSendFlag = FALSE;
}
void BUSInitGPIO()
{
GPIO_M_SET(BUS_STB, 1);
GPIO_M_SET(BUS_DAT, 1);
GPIO_M_SET(BUS_ACK, 1);
GPIO_O_SET(BUS_STB, 0);
GPIO_O_SET(BUS_DAT, 0);
GPIO_O_SET(BUS_ACK, 0);
BUSSendFI = 0;
BUSSendFO = 0;
BUSRecvFI = 0;
BUSRecvFO = 0;
FinishBUS();
}
void BUSSendData(BYTE Comm, BYTE Data)
{
BUSSendDataBackup = (Comm << 8) | Data;
FIFO_SEND_FI(BUSSendDataBackup);
BUSSendDoneFlag = FALSE;
}
void BUSSendCNTTail()
{
BYTE i;
BYTE XorSum;
XorSum = 0;
BUSSendData(COMM_BUS_PASSNOW, DBUS_GPSTAIL_SIZE);
for (i = 0; i < DBUS_GPSTAIL_SIZE; i++) {
BUSSendData(i, DBusGPSTail[i]);
XorSum ^= DBusGPSTail[i];
}
BUSSendData(DBUS_GPSTAIL_SIZE, XorSum);
}
#define GPS_SELF_TEST_DATA 0x68
BYTE BUSSelfTest()
{
TestBUSState = FALSE;
BUSSendData(COMM_INIT_STATE, 0x00);
TestBUSState = TRUE;
return TestBUSState;
}
void BUSTimer10mS()
{
if (TestBUSTimer) TestBUSTimer--;
}
#define BUS_TIME_EXPIRED (20) // 20mS
void PollingBUS()
{
if (BUSStep && BUSBitTimer == 0) {
if (BUSSendFlag) {
FIFO_SEND_FO_BACK(BUSDataBackup);
}
FinishBUS();
return;
}
switch (BUSStep) {
case 0x00:
if (BUS_DAT_READ) {
if (!FIFO_SEND_EMPTY && BUSTryCount == 0) {
BUSTryCount = 10;
BUS_DAT_LOW;
FIFO_SEND_FO(BUSData);
BUSDataBackup = BUSData;
BUSSendFlag = TRUE;
BUSStep = 0x10;
}
else
if (BUSTryCount) {
BUSTryCount--;
}
}
else {
BUS_ACK_LOW;
BUSStep = 0x20;
}
BUSBitTimer = BUS_TIME_EXPIRED;
return;
break;
case 0x10:
if (BUS_ACK_READ) return;
BUS_DAT_HIGH;
break;
case 0x11:
if (!BUS_ACK_READ) return;
if (BUSData & 0x8000) { BUS_DAT_HIGH; }
else { BUS_DAT_LOW; }
BUS_STB_LOW;
break;
case 0x12:
if (BUS_ACK_READ) return;
BUS_STB_HIGH;
if (BUSBitCount >= 15) {
BUSBitCount = 0;
BUS_DAT_HIGH;
BUS_ACK_LOW;
}
else {
BUSBitCount++;
BUSData <<= 1;
BUSStep = 0x10;
}
break;
case 0x13:
if (BUS_STB_READ) return;
BUS_ACK_HIGH;
break;
case 0x14:
if (!BUS_STB_READ) return;
#ifdef MONITOR_HARDWARE_TEST
psprintf(LineBuffer, "BUSS : %04x", BUSDataBackup);
MenuPrintMessage(3);
#endif
if (BUSDataBackup == BUSSendDataBackup) {
BUSSendDoneFlag = TRUE;
}
FinishBUS();
return;
case 0x20:
if (!BUS_DAT_READ) return;
BUS_ACK_HIGH;
break;
case 0x21:
if (BUS_STB_READ) return;
BUSData <<= 1;
if (BUS_DAT_READ) BUSData |= 0x01;
BUS_ACK_LOW;
break;
case 0x22:
if (!BUS_STB_READ) return;
BUS_ACK_HIGH;
if (BUSBitCount >= 15) {
BUSBitCount = 0;
BUS_DAT_HIGH;
}
else {
BUSBitCount++;
BUSStep = 0x20;
}
break;
case 0x23:
if (BUS_ACK_READ) return;
BUS_DAT_HIGH;
BUS_STB_LOW;
break;
case 0x24:
if (!BUS_ACK_READ) return;
FinishBUS();
FIFO_RECV_FI(BUSData);
return;
}
BUSStep++;
BUSBitTimer = BUS_TIME_EXPIRED;
}
/************************************************************************
* Communication Subroutine *
************************************************************************/
void PollingBUSComm()
{
UINT16 CommData;
BYTE Comm, Data;
if (!FIFO_RECV_EMPTY) {
FIFO_RECV_FO(CommData);
Comm = CommData >> 8;
Data = CommData & 0xFF;
#ifdef MONITOR_HARDWARE_TEST
psprintf(LineBuffer, "BUSR : %04x", CommData);
MenuPrintMessage(3);
#endif
if (Comm <= COMM_ADDR_END) {
if (Comm == BUSRecvSize) {
if (BUSRecvFlag && (BUSRecvData ^ Data) == 0) {
BUSRecvFlag = TRUE;
DBusMakeCNTData(BUSRecvType);
}
}
else
if (Comm == BUSRecvNext) {
BUSCommBuff[Comm] = Data;
BUSRecvNext++;
BUSRecvData ^= Data;
}
else {
BUSRecvFlag = TRUE;
}
return;
}
switch (Comm) {
case COMM_BUS_PASSEND:
BUSRecvFlag = TRUE;
BUSRecvType = Comm;
BUSRecvSize = Data;
BUSRecvNext = 0;
BUSRecvData = 0;
if (BUSRecvSize == 0 || BUSRecvSize > COMM_ADDR_END) {
BUSRecvFlag = FALSE;
}
break;
}
}
}
#endif SUPPORT_BUS_DEVICE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -