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

📄 bus.c

📁 C语言编写的监控中心终端程序。基于GPRS上传收发数据功能
💻 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 + -