我用SSD2828芯片实现RGB到MIPI,第一步初始化2828芯片,我做了复位和设置时钟,想验证一下芯片spi接口工作正常不,读取DeviceID,但是一直为零,不知道是哪里出了问题,哪个大神帮看一下,谢谢。
读ID的代码如下:
void ReadSSD2828_DeviceID(void) {
u8 i;
u8 SendBuffer[8];
u8 RecvBuffer[8];
if (Gpio_Init() == XST_SUCCESS)
printf("Initialize GPIO successed.\n\r");
else {
printf("Initialize GPIO failed.\n\r");
return;
}
//reset ssd2828
XGpioPs_WritePin(&Gpio, SHUT_Pin, 0x0);
XGpioPs_WritePin(&Gpio, CSX_Pin, 0x1);
XGpioPs_WritePin(&Gpio, SDC_Pin, 0x0);
XGpioPs_WritePin(&Gpio, SDO_Pin, 0x0);
XGpioPs_WritePin(&Gpio, RST_Pin, 0x1);
usleep(100);
XGpioPs_WritePin(&Gpio, RST_Pin, 0x0);
usleep(100);
XGpioPs_WritePin(&Gpio, RST_Pin, 0x1);
XGpioPs_WritePin(&Gpio, CSX_Pin, 0x0);
RecvBuffer[1] = SPI_WriteCmd(0xB7);
RecvBuffer[2] = SPI_WriteData(0x50); //50=TX_CLK 70=PCLK
RecvBuffer[3] = SPI_WriteData(0x00); //config register
XGpioPs_WritePin(&Gpio, CSX_Pin, 0x1);
usleep(100);
printf("Read SDI: %02X %02X %02X %02X\n\r", RecvBuffer[0], RecvBuffer[1],
RecvBuffer[2], RecvBuffer[3]);
/*SendBuffer[0] = 0xB0;
SendBuffer[1] = 0xFA;
SendBuffer[2] = 0;
SendBuffer[3] = 0;*/
XGpioPs_WritePin(&Gpio, CSX_Pin, 0x0);
RecvBuffer[0] = SPI_WriteCmd(0xD4);
RecvBuffer[1] = SPI_WriteData(0xFA);
RecvBuffer[2] = SPI_WriteData(0x00);
XGpioPs_WritePin(&Gpio, CSX_Pin, 0x1);
printf("Read SDI: %02X %02X %02X %02X\n\r", RecvBuffer[0], RecvBuffer[1],
RecvBuffer[2], RecvBuffer[3]);
XGpioPs_WritePin(&Gpio, CSX_Pin, 0x0);
RecvBuffer[0] = SPI_WriteCmd(0xB0);
//RecvBuffer[1] = SPI_WriteCmd(0xFA);
RecvBuffer[2] = SPI_WriteData(0x00);
RecvBuffer[3] = SPI_WriteData(0x00);
XGpioPs_WritePin(&Gpio, CSX_Pin, 0x1);
printf("Read SDI: %02X %02X %02X %02X\n\r", RecvBuffer[0], RecvBuffer[1],
RecvBuffer[2], RecvBuffer[3]);
}
//SPI4W8BIT
uint8_t SPI_WriteCmd(uint8_t CmdByte) {
uint8_t i, ret = 0;
XGpioPs_WritePin(&Gpio, CSX_Pin, 0x0);
XGpioPs_WritePin(&Gpio, SCK_Pin, 0x0);
XGpioPs_WritePin(&Gpio, SDC_Pin, 0x0); //command
for (i = 0; i < 8; i++) {
if (CmdByte & 0x80) //write 1 bit
XGpioPs_WritePin(&Gpio, SDO_Pin, 0x1);
else
XGpioPs_WritePin(&Gpio, SDO_Pin, 0x0);
XGpioPs_WritePin(&Gpio, SCK_Pin, 0x1); //clk=1
CmdByte = CmdByte << 1;
ret |= XGpioPs_ReadPin(&Gpio, SDI_Pin); //read 1 bit
ret = ret << 1;
XGpioPs_WritePin(&Gpio, SCK_Pin, 0x0); //clk=0
}
//XGpioPs_WritePin(&Gpio, CSX_Pin, 0x1);
return ret;
}
uint8_t SPI_WriteData(uint8_t DatByte) {
uint8_t i, ret = 0;
XGpioPs_WritePin(&Gpio, CSX_Pin, 0x0);
XGpioPs_WritePin(&Gpio, SCK_Pin, 0x0);
XGpioPs_WritePin(&Gpio, SDC_Pin, 0x1); //data
for (i = 0; i < 8; i++) {
if (DatByte & 0x80) //write 1 bit
XGpioPs_WritePin(&Gpio, SDO_Pin, 0x1);
else
XGpioPs_WritePin(&Gpio, SDO_Pin, 0x0);
XGpioPs_WritePin(&Gpio, SCK_Pin, 0x1); //clk=1
DatByte = DatByte << 1;
ret |= XGpioPs_ReadPin(&Gpio, SDI_Pin); //read 1 bit
ret = ret << 1;
XGpioPs_WritePin(&Gpio, SCK_Pin, 0x0); //clk=0
}
//XGpioPs_WritePin(&Gpio, CSX_Pin, 0x1);
return ret;
}