📄 sci.c
字号:
/*====================================================================
*
* Copyright (C) 1997 Acer Labs, Inc. All Rights Reserved.
*
* File: sci.c
*
* Contents: SCI bus services routines for M6311/M3325
*
* History:
* Date By Reason
* =========== ========= ======
* 19-May-1999 Charlemage for timing/ack process
* 23-Aug-2001 Dick Ma Porting to M3325
********************************************************************/
#include <comsub.h>
#include <gpio.h>
#include <sci.h>
#include <platform.h>
/*----------------------------------------------------------------------
* Function_Name: SciInit
*
* Description: Initialize the SCI bus
*
* Arguments:
*
* Return Value: void
*----------------------------------------------------------------------*/
void SciInit()
{
/* SCI Controled by SW !!! Using GPIO */
/* set SCI-CL/MC, SCI-DA/MD, SCI-VFD, ML0, ML1, ML2 to output high */
/************************** M3325C_PLATFORM **********************************/
/************************** M3351_PLATFORM **********************************/
#if (_TA==3) /* only mk bowei 2002/10/28 */
SET_GPIO_W(SCI_MC | SCI_MD | SCI_ML1 );
SET_GPIO_HI(SCI_MC | SCI_MD | SCI_ML1 );
#else
SET_GPIO_W(SCI_MC | SCI_MD | SCI_ML0 | SCI_ML1 | SCI_ML2);
SET_GPIO_HI(SCI_MC | SCI_MD | SCI_ML0 | SCI_ML1 | SCI_ML2);
#endif
/************************** M6303_PLATFORM **********************************/
}
/*----------------------------------------------------------------------
* Function_Name: SciDelay
*
* Description: Make a short delay for SCI
*
* Arguments:
* WORD w : delay (M3325 at 108M)
*
* Return Value: void
*----------------------------------------------------------------------*/
void SciDelay(WORD w)
{
DWORD dw;
DWORD dwCountSize;
dwCountSize=w*COUNTS_PER_MICROSECOND;
for(dw=0;dw<dwCountSize;dw++)
;
}
/*----------------------------------------------------------------------
* Function_Name: SciSetByte
*
* Description: Set one byte of data to SCI , LSB First
* Stream Format:
* MC \_____/----\
* MD ??DDDDDDDDDD
* width | Ta | Ta |
* Ta>400ns
*
* Arguments:
* BYTE bData :DATA to set to SCI
*
* Return Value: void
*----------------------------------------------------------------------*/
#if (_TRANSFER_ALI_BOARD_ == _TRANSFER_ALI_BOARD_ENABLE_)
void SciSetByte(BYTE bData)
{
BYTE b;
for(b=0;b<8;b++)
{
SET_GPIO_LOW(SCI_MC);/* pull SCI_MC low */
SET_GPIO_W(SCI_MD);/* SCI_MD write mode */
if(bData&0x01)
SET_GPIO_HI(SCI_MD);/* pull SCI_MD high */
else
SET_GPIO_LOW(SCI_MD);/* pull SCI_MD low */
#if (_TA==3)
SciDelay(10);/* delay 1us */ //bowei delay 10us
#else
SciDelay(1);/* delay 1us */
#endif
SET_GPIO_HI(SCI_MC);/*pull SCI_MC high*/
#if (_TA==3)
SciDelay(10);/* delay 1us */ //bowei delay 10us
#else
SciDelay(1);/* delay 1us */
#endif
bData>>=1;
}
}
#endif
/*----------------------------------------------------------------------
* Function_Name: SciSetByteMF
*
* Description: Set one byte of data to SCI, MSB FIRST
* Stream Format:
* MC \_____/----\
* MD ??DDDDDDDDDD
* width | Ta | Ta |
* Ta>400ns
*
* Arguments:
* BYTE bData :DATA to set to SCI
*
* Return Value: void
*----------------------------------------------------------------------*/
#if (_TRANSFER_ALI_BOARD_ == _TRANSFER_ALI_BOARD_ENABLE_)
void SciSetByteMF(BYTE bData)
{
BYTE b;
for(b=0;b<8;b++)
{
SET_GPIO_LOW(SCI_MC);/* pull SCI_MC low */
SET_GPIO_W(SCI_MD);/* SCI_MD write mode */
if(bData&0x80)
SET_GPIO_HI(SCI_MD);/* pull SCI_MD high */
else
SET_GPIO_LOW(SCI_MD);/* pull SCI_MD low */
#if (_TA==3)
SciDelay(10);/* delay 1us */ //bowei delay 10us
#else
SciDelay(1);/* delay 1us */
#endif
SET_GPIO_HI(SCI_MC);/* pull SCI_MC high */
#if (_TA==3)
SciDelay(10);/* delay 1us */ //bowei delay 10us
#else
SciDelay(1);/* delay 1us */
#endif
bData<<=1;
}
}
#endif
/*----------------------------------------------------------------------
* Function_Name: SciGetByte
*
* Description: Get one byte of bData from SCI, LSB First
* Stream Format:
* MC \_____/----\
* MD ??DDDDDDDDDD
* width | Ta | Ta |
* Ta>400ns
*
* Arguments:
*
* Return Value: void
* byte get from SCI bus
*----------------------------------------------------------------------*/
#if (_TRANSFER_ALI_BOARD_ == _TRANSFER_ALI_BOARD_ENABLE_)
BYTE SciGetByte()
{
BYTE ret;
BYTE b;
// SET_GPIO_LOW(SCI_MC);/* pull SCI_MC low */
// SET_GPIO_W(SCI_MD);/* SCI_MD write mode */
// SET_GPIO_HI(SCI_MD);/* pull SCI_MD high */
for(b=0;b<8;b++)
{
SET_GPIO_LOW(SCI_MC);/* pull SCI_MC low */
SET_GPIO_R(SCI_MD);/* SCI_MD read mode */
ret>>=1;
#if (_TA==3)
SciDelay(30);/* delay 2us *///bowei delay 30us
#else
SciDelay(2);/* delay 2us */
#endif
SET_GPIO_HI(SCI_MC);/* pull SCI_MC high */
#if (_TA==3)
SciDelay(20);/* delay 1us *///bowei delay 20us
#else
SciDelay(1);/* delay 1us */
#endif
if(GET_GPIO_DATA(SCI_MD))
ret|=0x80;/* SCI_MD=1 */
else
ret&=0x7f;/* SCI_MD=0 */
#if (_TA==3)
SciDelay(5);/* delay 1us *///bowei delay 5us
#else
SciDelay(1);/* delay 1us */
#endif
}
return ret;
}
#endif
/*----------------------------------------------------------------------
* Function_Name: SciGetByteMF
*
* Description: Get one byte of bData from SCI, MSB first
* Stream Format:
* MC \_____/----\
* MD ??DDDDDDDDDD
* width | Ta | Ta |
* Ta>400ns
*
* Arguments:
*
* Return Value: void
* byte get from SCI bus
*----------------------------------------------------------------------*/
#if (_TRANSFER_ALI_BOARD_ == _TRANSFER_ALI_BOARD_ENABLE_)
BYTE SciGetByteMF()
{
BYTE ret;
BYTE b;
// SET_GPIO_LOW(SCI_MC);/* pull SCI_MC low */
// SET_GPIO_HI(SCI_MD);/* pull SCI_MD high */
// SET_GPIO_W(SCI_MD);/* SCI_MD write mode */
for(b=0;b<8;b++)
{
SET_GPIO_LOW(SCI_MC);/* pull SCI_MC low */
SET_GPIO_R(SCI_MD);/* SCI_MD read mode */
ret<<=1;
#if (_TA==3)
SciDelay(30);/* delay 2us *///bowei delay 30us
#else
SciDelay(2);/* delay 2us */
#endif
SET_GPIO_HI(SCI_MC);/* pull SCI_MC high */
#if (_TA==3)
SciDelay(20);/* delay 1us *///bowei delay 20us
#else
SciDelay(1);/* delay 1us */
#endif
if(GET_GPIO_DATA(SCI_MD))
ret|=0x01;/* SCI_MD=1 */
else
ret&=0xfe;/* SCI_MD=0 */
#if (_TA==3)
SciDelay(5);/* delay 1us *///bowei delay 5us
#else
SciDelay(1);/* delay 1us */
#endif
}
return ret;
}
#endif
#if (_TA==3)
/**********************************************/
/********** only mk bowei 2002/10/28 **********/
/**********************************************/
void SciSet4Bits(BYTE data)
{
BYTE i;
for(i=0;i<4;i++)
{
SET_GPIO_LOW(SCI_MC);
SET_GPIO_W(SCI_MD);//???xing
if(data&0x01)
SET_GPIO_HI(SCI_MD);
else
SET_GPIO_LOW(SCI_MD);
SciDelay(10);
SET_GPIO_HI(SCI_MC);
SciDelay(10);
data>>=1;
}
SET_GPIO_R(SCI_MD);//???xing
}
/*xing customer1 begin*/
/*----------------------------------------------------------------------
* Function_Name: SciSet9Bits
*
* Description:
*
* Arguments:
*
* Return Value: void
* byte get from SCI bus
*----------------------------------------------------------------------*/
void SciSet9Bits(WORD data)
{
BYTE i;
for(i=0;i<9;i++)
{
SET_GPIO_LOW(SCI_MC);
SET_GPIO_W(SCI_MD);//???xing
if(data&0x01)
SET_GPIO_HI(SCI_MD);
else
SET_GPIO_LOW(SCI_MD);
SciDelay(10);
SET_GPIO_HI(SCI_MC);
SciDelay(10);
data>>=1;
}
SET_GPIO_R(SCI_MD);//???xing
}
void SciSet9BitsMSF(WORD data)
{
BYTE i;
data<<=7;
for(i=0;i<9;i++)
{
SET_GPIO_LOW(SCI_MC);
SET_GPIO_W(SCI_MD);//???xing
if(data&0x8000)
SET_GPIO_HI(SCI_MD);
else
SET_GPIO_LOW(SCI_MD);
SciDelay(10);
SET_GPIO_HI(SCI_MC);
SciDelay(10);
data<<=1;
}
SET_GPIO_R(SCI_MD);//???xing
}
/*----------------------------------------------------------------------
* Function_Name: SciSet12Bits
*
* Description:
*
* Arguments:
*
* Return Value: void
* byte get from SCI bus
*----------------------------------------------------------------------*/
void SciSet12Bits(WORD data)
{
BYTE i;
for(i=0;i<12;i++)
{
SET_GPIO_LOW(SCI_MC);/* pull SCI_MC low */
SET_GPIO_W(SCI_MD);//???xing
if(data&0x01)
SET_GPIO_HI(SCI_MD);
else
SET_GPIO_LOW(SCI_MD);
SciDelay(10);
SET_GPIO_HI(SCI_MC);
SciDelay(10);
data>>=1;
}
SET_GPIO_R(SCI_MD);//???xing
}
/*----------------------------------------------------------------------
* Function_Name: SciSetCls
*
* Description:
*
* Arguments:
*
* Return Value: void
*----------------------------------------------------------------------*/
void SciSetCls(WORD data)
{
BYTE i;
for(i=0;i<9;i++)
{
SET_GPIO_LOW(SCI_MC);/* pull SCI_MC low */
SET_GPIO_W(SCI_MD);//???xing
if(data&0x01)
SET_GPIO_HI(SCI_MD);
else
SET_GPIO_LOW(SCI_MD);
SciDelay(10);
SET_GPIO_HI(SCI_MC);
SciDelay(10);
data>>=1;
}
for(i=1;i<=128;i++)
{
SET_GPIO_LOW(SCI_MC);/* pull SCI_MC low */
SET_GPIO_W(SCI_MD);//???xing
if(0x0)
SET_GPIO_HI(SCI_MD);
else
SET_GPIO_LOW(SCI_MD);
SciDelay(10);
SET_GPIO_HI(SCI_MC);
SciDelay(10);
}
SET_GPIO_R(SCI_MD);//???xing
}
/*--------------------------------------------------
char SciHold();
Hold the SCI Bus.
Arguments:
NONE
Return value:
TRUE for OK
by Charlemagne Yue
---------------------------------------------------*/
BOOL SciHold()
{ //WaitSem(SCI_semid);
return TRUE;
}
/*--------------------------------------------------
char SciRelease();
Hold the SCI Bus.
Arguments:
NONE
Return value:
TRUE for OK
by Charlemagne Yue
---------------------------------------------------*/
BOOL SciRelease()
{ //SigSem(SCI_semid);
return TRUE;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -