||
FULL Duplex接口模式即标准SPI全双工模式。该模式需要V2DAP修改代码重新编译。请用Vinculum II IDE打开V2DAP的工程,打开V2DAP.c文件,搜SPI_SLAVE_MODE_VI_COMPATIBLE,将”monitor_iocb.set.param = SPI_SLAVE_MODE_VI_COMPATIBLE;”修改为”monitor_iocb.set.param = SPI_SLAVE_MODE_FULL_DUPLEX;”,重新编译下载rom。
写时序图如下:
先发送8bit的CMD字节,实际是高4bit输出,低4bit输入,因为是全双工通信,所以组成一个字节。每个bit的含义如下:
A0-A2: 用于多SLAVE中,一般无用,默认是0.
R/W#: 1表示读,0表示写
TXE:1表示从机无数据发送,即不能读
RXF:1表示从机接收buffer有数据,即不能写
ACK:1表示从机地址正确。
void vnc2SpiWrite(char spiData)
{
uint8_t rd;
vnc2SpiEn();
rd = spiTransferByte(0x00); //CMD
if((rd & 0x02) == 0x00 || (rd & 0x04) == 0x04) //ACK = 0 //RXF = 1, full
{
Printf("%s err1\n", __FUNCTION__);
vnc2SpiDis();
return;
}
rd = spiTransferByte(spiData);
if( (rd & 0x02) == 0x00 )
{
Printf("%s err2\n", __FUNCTION__);
}
vnc2SpiDis();
//delayms(20); //For debug
}
读时序如下图:
读时序和写时序类似,区别读完有效数据后不需要读STATUS。
int8_t vnc2SpiRead(char *pSpiData)
{
uint8_t rd;
vnc2SpiEn();
rd = spiTransferByte(0x10);
if((rd & 0x02) == 0x02) //ACK =1
{
if((rd & 0x08) == 0x08) //TXE = 1, have no data
{
vnc2SpiDis();
return XFER_RETRY;
}
}
*pSpiData = spiTransferByte(0xff);
vnc2SpiDis();
return XFER_OK;
}
同样,修改接口宏定义
#define monWrite vnc2SpiWrite
#define monRead vnc2SpiRead