📄 ms_rwreg.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 + -