?? spi.c
字號:
#include "spi_h.h"
#include "intrins.h"
//==============================
void delay_US1(INT8U i)
{
while (--i);
return ;
}
/*=============================
== 函數名稱:delay_ms()
== 函數功能:ms delay process.
==入口參數: INT16U time
==出口參數:
==============================*/
void delay_MS1(INT16U time)
{
time=time*2;
while (time != 0)
{
delay_us(1000);
time--;
}
}
//======================================
void SPIDataSend(INT8U DatBuff)
{
INT8U DatCount;
INT8U SPIDatCount;
SPI_RDY=1;
//delayNOP();
for (DatCount=0; DatCount<8; DatCount++) // Write 8 bits of data
{
SPIDatCount=0;
while(1)
{
if (!SPI_SCK )
{
SPIDatCount=0;
break;
}
delay_MS1(1); //no signal will wait for .
SPIDatCount++;
if (SPIDatCount>=SPIRepeatCount)
{
break;
}
}
if (DatBuff&0x01) // send first MSB
{
SPI_MOSI=1; // Write a one SPI_MOSI=1
}
else
{
SPI_MOSI=0; // Write a zero SPI_MOSI=0
}
// delay_us(1);
while(1) //wait SPI_SCK change to High.
{
if (SPI_SCK )
{
SPIDatCount=0;
break;
}
delay_MS1(1);
SPIDatCount++;
if (SPIDatCount>=SPIRepeatCount)
{
break;
}
}
DatBuff >>=1;
}
SPI_RDY=0;
}
/*=============================
== 函數名稱:WriteSPIData ()
== 函數功能:write SPI data
==入口參數: INT8U Dat1,INT8U Dat2
==出口參數:
==============================*/
void WriteSPIData (uchar Dat1,uchar Dat2)
{
INT8U i;
INT8U SendRepeatCount;
SPI_ATN_FM=1; //set ATN_FM high ,Enable SPI send data
delay_ms(200);
SPI_ATN_FM=0;
for(SendRepeatCount=0;SendRepeatCount<3;SendRepeatCount++)
{
i=0;
while (1)
{
if (SPI_SCK) //waite first SCK cause an interrupt in the HOST
{
SPIDataSend(Dat1);
break;
}
delay_MS1(1);
i++;
if (i>=SPIRepeatCount) //wait cycle return 0
{
break;
}
}
delay_MS1(20);
i=0;
while (1)
{
if (SPI_SCK) //waite first SCK cause an interrupt in the HOST
{
SPIDataSend(Dat2);
break;
}
//delayNOP();
delay_MS1(1);
i++;
if (i>=SPIRepeatCount)
{
break;
}
}
if ((!SPI_MISO)&&(!SPI_SCK)) //add: repeat send error check.
{
SPI_ATN_FM=1; //set ATN_FM high ,Enable SPI send data
delay_ms(200);
SPI_ATN_FM=0;
}
else
{
break;
}
}
}
/*=============================
== 函數名稱:ReadSPICmdDat ()
== 函數功能:read SPI command data from host.
==入口參數:
==出口參數: return SPIReadDatBuff;
==============================*/
INT16U ReadSPICmdDat (void)
{
INT8U i;
INT8U datin;
INT16U ldat=0x00;
INT8U SPIReadCount1=0;
while(1)
{
while(1)
{
if (SPI_SCK ) //wait SCK low
{
SPIReadCount1=0;
break;
}
delay_US1(100);
SPIReadCount1++;
if (SPIReadCount1>=200)
{
break;
}
}
// if ((!SPI_MISO)&&(!SPI_SCK))
if (1)
{
SPI_RDY=1;
/*
MICEnable_LED=0; //debug test ready signal on
delay_ms(5000);
MICEnable_LED=1;
*/
//#if 0
for(i=0; i<16; i++) //send 8 bit data
{
while(1)
{
if (!SPI_SCK ) //wait SCK low
{
SPIReadCount1=0;
break;
}
delay_US1(100);
SPIReadCount1++;
if (SPIReadCount1>=100)
{
break;
}
}
if (SPI_MISO)
{
datin = 1; //read one
}
else
{
datin = 0; //read zero
}
if(datin>0) //read LSB
{
ldat=ldat|0x8000;
}
else
{
ldat=ldat&0x7fff;
}
if(i!=15)
{
ldat=ldat>>1;
}
while(1)
{
if (SPI_SCK ) //wait SCK low
{
SPIReadCount1=0;
break;
}
delay_US1(100);
SPIReadCount1++;
if (SPIReadCount1>=100)
{
break;
}
}
}
SPI_RDY=0;
delay_MS1(10);
//WriteSPIData(ldat>>8,ldat);
return ldat;
}
/*
delay_ms(5); //debug test SCK high
if (SPI_SCK)
{
MICEnable_LED=0;
delay_ms(4000);
}
break;
*/
//if (i==1)
///{
// return 0;
//}
}
}
//===================================
void SPI_RECIVE_PRO (void)
{
uchar Re_SPI_Dat = 0x00, Re_SPI_CMD = 0x00;
// static
uint SPICmdResult = 0x0000;
if ((!SPI_MISO)&&(!SPI_SCK)) /* wait DO and SCK will be set Low*/
{
SPICmdResult = ReadSPICmdDat();
}
else return;
Re_SPI_Dat = (SPICmdResult & 0xff);
SPICmdResult >>= 8;
Re_SPI_CMD = (SPICmdResult & 0xff);
switch (Re_SPI_CMD)
{
case ALARMCMD_CANCEL:
ALARM_CANCLE( );
break;
case PELCODCMD_Tr:
{
switch (Re_SPI_Dat)
{
case PELCOD_LEFT:
Send_order (P_left, PAddr, PSpeed);
break;
case PELCOD_RIGHT:
Send_order (P_right, PAddr, PSpeed);
break;
case PELCOD_UP:
Send_order (P_up, PAddr, PSpeed);
break;
case PELCOD_DOWN:
Send_order (P_down, PAddr, PSpeed);
break;
case PELCOD_ZOUT:
Send_order (Zoom_out, PAddr, PSpeed);
break;
case PELCOD_ZIN:
Send_order (Zoom_in, PAddr, PSpeed);
break;
case PELCOD_ICLOSE:
Send_order (Iris_close, PAddr, PSpeed);
break;
case PELCOD_IOPEN:
Send_order (Iris_open, PAddr, PSpeed);
break;
case PELCOD_FFAR:
Send_order (Foc_far, PAddr, PSpeed);
break;
case PELCOD_FNEAR:
Send_order (Foc_near, PAddr, PSpeed);
break;
case PELCOD_AUTO_START:
Send_Bytes (PELCOD_auto, 7, PAddr);
break;
case PELCOD_AUTO_STOP:
Send_Bytes (PELCOD_stop, 7, PAddr);
break;
default: break;
}
break;
}
case PELCOD_ADDR:
if (Re_SPI_Dat < 0x3f)
PAddr = Re_SPI_Dat;
break;
case VFULLCMD:
CH_Status = Re_SPI_Dat;
FullPosition ( );
break;
case VSCALECMD:
CH_Status = Re_SPI_Dat;
ScalePosition ( );
break;
case SYSCONFIGCMD:
switch (Re_SPI_Dat)
{
case SYSMOCMD_DVD:
USB_HALT = 0;
break;
case SYSMOCMD_MON:
USB_HALT = 0;
break;
case SYSMOCMD_REC:
USB_HALT = 0;
break;
case SYSMOCMD_USB:
USB_HALT = 1;
break;
case SYSVFCMD_PAL:
break;
case SYSVFCMD_NTS:
break;
case SYSVDCMD_UNS:
break;
case SYSVDCMD_SIN:
break;
case BDR485CMD_12:
COM_Baud_set (Baud_12);
break;
case BDR485CMD_24:
COM_Baud_set (Baud_24);
break;
case BDR485CMD_48:
COM_Baud_set (Baud_48);
break;
case BDR485CMD_96:
COM_Baud_set (Baud_96);
break;
case ALSENCMD_NOPEN:
Sensor_Status = 1; //value 1 direct sensor normal open
break;
case ALSENCMD_NCLOS:
Sensor_Status = 0; //value 0 direct sensor normal close
break;
default: break;
}
break;
default: break;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -