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

日志

VNC2 V2DAP学习笔记 8-SPI Half Duplex 3PIN接口设计

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

SPI Half Duplex 3PIN接口模式也是一种自定义的模式,与Full Duplex不同的是它只使用了3pin来实现通信,其中MOSI作为输入输出脚实现数据的读写,没有使用MISO。同样,需要修改VNC2固件代码为”monitor_iocb.set.param = SPI_SLAVE_MODE_HALF_DUPLEX_3_PIN;” ,另外,MOSIVNC2端变成输入输出脚,需要修改该PinIO状态,找到对应的VNC2芯片(以32pinVNC2为例)和接口修改:

vos_iomux_define_bidi(30, IOMUX_IN_SPI_SLAVE_0_MOSI, IOMUX_OUT_SPI_SLAVE_0_MOSI);

重新编译下载rom

读写时序如下:

 

同样,定义好IO口的操作接口宏定义,其中MOSI要有设置输入输出的接口宏定义VNC2_SET_MOSI()VNC2_SET_MISO(),其他接口宏定义与VNC1L接口模式类似。

#define VNC2_CSEn()                GPIO_ResetBits(GPIOA, GPIO_Pin_4)

#define VNC2_CSDis()               GPIO_SetBits(GPIOA, GPIO_Pin_4)

#define VNC2_SCKLow()           GPIO_ResetBits(GPIOA, GPIO_Pin_5)

#define VNC2_SCKHigh()          GPIO_SetBits(GPIOA, GPIO_Pin_5)

#define VNC2_SET_MOSI()      GPIOA->MODER |= (((uint32_t)GPIO_Mode_OUT)<<(7 * 2))

#define VNC2_SET_MISO()      GPIOA->MODER &= ~(GPIO_MODER_MODER0 << (7 * 2))

#define VNC2_MOSILow()       GPIO_ResetBits(GPIOA, GPIO_Pin_7

#define VNC2_MOSIHigh()      GPIO_SetBits(GPIOA, GPIO_Pin_7)

#define VNC2_RdMISO()          ((GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_7) == Bit_SET) ? 1 : 0)

8bit数据的函数如下,同样是上升沿送数据。

void vnc2SpiHalf3PinWrByte(uint8_t wrData)

{

uint8_t i;

VNC2_SET_MOSI();

for(i = 0; i < 8; i++)

{

         VNC2_SCKLow();

         if(wrData & 0x80)

                   VNC2_MOSIHigh();

         else

                   VNC2_MOSILow();

         delayus(1);

         VNC2_SCKHigh();

         delayus(1);

         wrData <<= 1;

}

}

8bit数据的函数如下,同样是下降沿读数据。

uint8_t vnc2SpiHalf3PinRdByte(void)

{

uint8_t rdDat = 0, i;

VNC2_SET_MISO();

for(i = 0; i < 8; i++)

{

         rdDat <<= 1;

         VNC2_SCKLow();

         delayus(1);

         rdDat |= VNC2_RdMISO();

         VNC2_SCKHigh();

         delayus(1);

}

return rdDat;

}

VNC2一个字节的函数如下:

int8_t vnc2SpiRead(char *pSpiData)

{

uint8_t rd;

VNC2_SCKLow();

VNC2_CSEn();

vnc2SpiHalf3PinWrByte(0x10);

rd = vnc2SpiHalf3PinRdByte();

if((rd & 0x08) == 0x08 || ((rd & 0x02) == 0x00)) //TXE = 1, have no data, //ACK = 0

{

         //Printf("%s err1: %x\n", __FUNCTION__, rd);

         VNC2_CSDis();

         return XFER_RETRY;

}

*pSpiData = vnc2SpiHalf3PinRdByte();

VNC2_CSDis();

return XFER_OK;

}

VNC2一个字节的函数如下:

void vnc2SpiWrite(char spiData)

{

uint8_t rd;

VNC2_SCKLow();

VNC2_CSEn();

vnc2SpiHalf3PinWrByte(0x00);

rd = vnc2SpiHalf3PinRdByte();

if((rd & 0x02) == 0x00 || (rd & 0x04) == 0x04) //ACK = 0 //RXF = 1, full

{

         Printf("%s err1: %x\n", __FUNCTION__, rd);

         VNC2_CSDis();

         return;

}

vnc2SpiHalf3PinWrByte(spiData);

VNC2_CSDis();

//delayms(20); //For debug

}

评论 (0 个评论)