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

📄 ms_rwreg.c

📁 MST720-DEMO程序
💻 C
字号:
/******************************************************************************
 Copyright (c) 2005 MStar Semiconductor, Inc.
 All rights reserved.

 [Module Name]: Ms_RWreg.c
 [Date]:	13-Jan-2005
 [Comment]:
   Mstar IC access functions.
 [Reversion History]:
*******************************************************************************/
#define _MS_RWREG_C_

/********************
* INCLUDE FILES     *
*********************/
#include <intrins.h>
#include "Project.h"
#include "Mcu_reg.h"
#include "Ms_RWreg.h"
#include "Ms7X_reg.h"
#include "debug.h"
#include "Mcu.h"//kevin
#include "Global.h"//kevin

#define Delay1us()	_nop_()

/**********************
* FUNCTION PROTOTYPES *
***********************/
#if ( BUS_TYPE_SEL == DIRECT_BUS )
#define MS_REG(addr)		(((unsigned char xdata*)0)[addr])
#endif

//////////////////////////////////////////////////////////////////////////////
// <Name>: msBusInitial
//
// <Description>: MST I/O bus initialize.
//////////////////////////////////////////////////////////////////////////////

#if ( BUS_TYPE_SEL == SERIAL_BUS )

void mstBusInitial(void)
{
    bCS_PIN = 0;
    bSCL_PIN = 1;
    bSDA_PIN = 1;
}
//////////////////////////////////////////////////////////////
// MST I/O control start.(serial bus)
//
//                 ________________
//  CS  ____/
//                        _____
//  SCL ________/        \______
//                   __________
//  SDA _____/                 \____
//                  \__________/
//////////////////////////////////////////////////////////////
void mstSPIStart(BIT bSelWrRd)
{
	//disable EA bit
	
	SET_SPI_CS(_HIGH);
	SET_SPI_SCL(_LOW);

	if (bSelWrRd == SPI_READ)	// read bit
		SET_SPI_SDA(_HIGH);
	else						// write bit
		SET_SPI_SDA(_LOW);

	SET_SPI_SCL(_HIGH);
	SET_SPI_SCL(_LOW);

	// release EA bit
}

//////////////////////////////////////////////////////////////
// Receive byte from MST chip.(serial bus)
//
// Arguments: bLast - last one bit
//           (MS_IS_LAST_BIT/MS_NON_LAST_BIT)
// Return value: receive byte
//////////////////////////////////////////////////////////////
BYTE mstSPIReceiveByte(BOOL bLast)
{
	BYTE ucIndex; // loop index
	BYTE ucBuf = 0x00; // byte buffer

	// disable all interrupt

	SET_SPI_SDA(_HIGH); // preset SDA high
	
	for (ucIndex=7; ucIndex!=0; ucIndex--)
	{
		SET_SPI_SCL(_HIGH);
		Delay1us();

		ucBuf <<= 1; // next
		
		if (bSDA_PIN == _HIGH) // check SDA
			ucBuf |= _BIT0; // set bit0

		SET_SPI_SCL(_LOW);
	}

	if (bLast == MS_IS_LAST_BIT) // last one
		SET_SPI_CS(_LOW);

	// last bit
	SET_SPI_SCL(_HIGH);
	Delay1us();

	ucBuf <<= 1; // next
	
	if (bSDA_PIN == _HIGH) // check SDA
		ucBuf |= _BIT0; // set bit0

	SET_SPI_SCL(_LOW);

	if (bLast == MS_IS_LAST_BIT) // last one
	{
		SET_SPI_SDA(_HIGH);
		SET_SPI_SCL(_HIGH);
	}

	if ((bit)(g_ucSystemFlag & ENTER_SPI_DEBUG) == TRUE)//20050920
		SET_SPI_CS(_HIGH);	

	// release EA bit
	return ucBuf;
}

//////////////////////////////////////////////////////////////
// Send byte to MST chip.(serial bus)
//
// Arguments: ucVal - output byte
//            bLast - last one bit
//            (MS_IS_LAST_BIT/MS_NON_LAST_BIT)
//////////////////////////////////////////////////////////////
void mstSPISendByte(BYTE ucVal, BOOL bLast)
{
	BYTE ucIndex; // loop index

	// disable all interrupt

	for (ucIndex=7; ucIndex!=0; ucIndex--)
	{
		SET_SPI_SDA((bit)(ucVal & _BIT7));
		ucVal <<= 1; // next

		SET_SPI_SCL(_HIGH); // clock
		Delay1us();
		SET_SPI_SCL(_LOW);
	}

	if (bLast == MS_IS_LAST_BIT) // last one
		SET_SPI_CS(_LOW);

	// last bit
	SET_SPI_SDA((bit)(ucVal & _BIT7));
	Delay1us();

	SET_SPI_SCL(_HIGH); // clock
	Delay1us();
	SET_SPI_SCL(_LOW);

	if (bLast == MS_IS_LAST_BIT) // last one
	{
		SET_SPI_SDA(_HIGH);
		SET_SPI_SCL(_HIGH);
	}

	if ((bit)(g_ucSystemFlag & ENTER_SPI_DEBUG) == TRUE)//20050920
		SET_SPI_CS(_HIGH);	

	// release EA bit
}
#endif

BYTE mstReadByte(BYTE ucAddr)
{
#if (BUS_TYPE_SEL == DIRECT_BUS)
	return *((BYTE pdata*) ucAddr);
#elif ( BUS_TYPE_SEL == SERIAL_BUS )
    mstSPIStart(SPI_READ); // read command
    mstSPISendByte(ucAddr, MS_NON_LAST_BIT); // register index
    
    return mstSPIReceiveByte(MS_IS_LAST_BIT); // read register data
#endif
}

WORD mstReadWord(BYTE ucAddr)
{
	WORD uwValue;

#if (BUS_TYPE_SEL == DIRECT_BUS)
	uwValue = mstReadByte(ucAddr);
	uwValue = (uwValue << 8) |mstReadByte(ucAddr-1);

	return uwValue;
#elif ( BUS_TYPE_SEL == SERIAL_BUS )
	uwValue = mstReadByte(ucAddr);
	uwValue = (uwValue * 0x100) + mstReadByte(ucAddr - 1);

	return uwValue;
#endif
}

void mstWriteByte(BYTE ucAddr, BYTE ucValue)
{
#if (BUS_TYPE_SEL == DIRECT_BUS)
	*((BYTE pdata*) ucAddr) = ucValue;
#elif ( BUS_TYPE_SEL == SERIAL_BUS )
    mstSPIStart(SPI_WRITE); // write command
    mstSPISendByte(ucAddr, MS_NON_LAST_BIT); // register index
    mstSPISendByte(ucValue, MS_IS_LAST_BIT);
#endif

}

void mstWriteWord(BYTE ucAddr, WORD uwValue)
{
#if (BUS_TYPE_SEL == DIRECT_BUS)
	mstWriteByte(ucAddr - 1, uwValue&0xFF);
	mstWriteByte(ucAddr, uwValue>>8);
#elif ( BUS_TYPE_SEL == SERIAL_BUS )
	mstWriteByte(ucAddr -1, (BYTE)uwValue);
	mstWriteByte(ucAddr, (BYTE)(uwValue / 0x100));
#endif
}

void mstWriteData(BYTE addr, BYTE code *tbl, WORD count, bit inc)
{
	count++;
	while (count--)
	{
		mstWriteByte(addr, *(tbl++));
		if(inc)
		addr++;
	}
}

void mstWriteDataTable(BYTE code *s)
{
	BYTE index, cnt;

	while ((cnt = *s++) != -1) 
	{
		index = *s++;
		mstWriteData(index, s, cnt-1, 1);
		s += cnt;
	}

}

⌨️ 快捷键说明

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