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