pq113_6的个人空间 https://bbs.21ic.com/?51690 [收藏] [复制] [RSS]

日志

VNC2 V2DAP学习笔记 6-SPI Full Duplex接口设计

已有 484 次阅读2019-1-23 10:23 |个人分类:USB桥接|系统分类:原稿与翻译

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

写时序图如下:

 先发送8bitCMD字节,实际是高4bit输出,低4bit输入,因为是全双工通信,所以组成一个字节。每个bit的含义如下:

A0-A2: 用于多SLAVE中,一般无用,默认是0.

R/W#: 1表示读,0表示写

TXE1表示从机无数据发送,即不能读

RXF1表示从机接收buffer有数据,即不能写

ACK1表示从机地址正确。

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

评论 (0 个评论)