s3c6410 spi转uart通讯 wince
板子是TINY6410,目前正在调试SPI转UART驱动,问题的内容比较长,我想一下子都写清楚,请高手帮我分析下
驱动自带是SPI0,现在我们使用的是SPI1接口,我把SPI1的IO口,时钟都打开了
在SPI读写的SPI_IOControl里仿照IIC驱动增加了
SPI_IOCTL_WRITE和SPI_IOCTL_READ控制
代码如下:
case SPI_IOCTL_WRITE:
EnterCriticalSection(&(pSpiPublic->CsTxAccess));
if(SPI_Write(dwInst, &(SPIPacketin->pbyBuf), SPIPacketin->wLen))
{
// success
}
else
{
SetLastError(ERROR_TIMEOUT);
bResult = FALSE;
}
LeaveCriticalSection(&(pSpiPublic->CsTxAccess));
break;
case SPI_IOCTL_READ:
EnterCriticalSection(&(pSpiPublic->CsTxAccess));
if(SPI_Write(dwInst, &(SPIPacketin->pbyBuf), SPIPacketin->wLen))
{
// success
}
else
{
SetLastError(ERROR_TIMEOUT);
bResult = FALSE;
}
LeaveCriticalSection(&(pSpiPublic->CsTxAccess));
EnterCriticalSection(&(pSpiPublic->CsRxAccess));
if(SPI_Read(dwInst, &(SPIPacketout->pbyBuf), SPIPacketout->wLen))
{
// success
}
else
{
SetLastError(ERROR_TIMEOUT);
*lpBytesRetruned = 0;
bResult = FALSE;
}
LeaveCriticalSection(&(pSpiPublic->CsRxAccess));
break;
SPIWriteReg和SPIReadReg我也一起贴出来吧!
VOID SPIWriteReg(BYTE byRegAddr, BYTE byData, BYTE byChannel)
{
SPI_PACKET SPIPacket;
DWORD dwErr=0;
BYTE byReg;
BYTE Tmp_Data[2];
byReg = (WRITE<<WRSHIFT)|((byRegAddr)<<REGSHIFT)|(byChannel<<CHANNELSHIFT);
Tmp_Data[0] = byReg;
Tmp_Data[1] = byData;
SPIPacket.pbyBuf = Tmp_Data;
SPIPacket.wLen = 2;
SPIMSG((_T("\r\nSPIWriteReg byReg[0] = 0x%x. byReg[1] = 0x%x \r\n"), Tmp_Data[0], Tmp_Data[1]));
if ( !DeviceIoControl(hSPI, // file handle to the driver
SPI_IOCTL_WRITE, // I/O control code
&SPIPacket, // in buffer
sizeof(SPI_PACKET), // in buffer size
NULL, // out buffer
0, // out buffer size
NULL, // number of bytes returned
NULL)) // ignored (=NULL)
{
dwErr = GetLastError();
SPIERR((_T("SPI_IOCTL_WRITE ERROR: %u \r\n"), dwErr));
}
}
BYTE SPIReadReg(BYTE byRegAddr, BYTE byChannel)
{
SPI_PACKET SPIPacket[2];
DWORD dwErr=0;
BYTE byReg;
BYTE byOutData;
byReg = (READ<<WRSHIFT)|((byRegAddr)<<REGSHIFT)|(byChannel<<CHANNELSHIFT);
SPIPacket[0].pbyBuf = &byReg;
SPIPacket[0].wLen = 1;
SPIPacket[1].pbyBuf = &byOutData;
SPIPacket[1].wLen = 1;
SPIMSG((_T("\r\n"));
if ( !DeviceIoControl(hSPI, // file handle to the driver
SPI_IOCTL_READ, // I/O control code
&SPIPacket[0], // in buffer
sizeof(SPI_PACKET), // in buffer size
&SPIPacket[1], // in buffer
sizeof(SPI_PACKET), // in buffer size
NULL, // number of bytes returned
NULL)) // ignored (=NULL)
{
dwErr = GetLastError();
SPIERR((_T("SPI_IOCTL_READ ERROR: %u \r\n"), dwErr));
}
SPIMSG((_T("SPIReadReg byReg = 0x%x. byOutData = 0x%x \r\n"), byReg, byOutData));
return byOutData;
}
在测试代码中先写再读
SPIWriteReg(LCR, 0x80, byChannel);//reset LCR for program bautrae
byVal = SPIReadReg(LCR, byChannel);
SPIMSG((TEXT("LCR = 0x%x.\r\n"), byVal));
SPIWriteReg(DLL, 0x0C, byChannel);//set bautrate=9600;
byVal = SPIReadReg(DLL, byChannel);
SPIMSG((TEXT("DLL = 0x%x.\r\n"), byVal));
现在的问题是:
1:读出来的数据不对,不知道是写的时候出错还是读的时候出错的!
2:第一次读写打印信息正常,第二次就写不进去了,打印信息显示到下面就进行不下去了,进去了死循环了!
下面是打印信息:
CPddSPI2Uart::Init(CH0)++
SPI2Uart.dll built Nov 6 2012 at 11:20:34.
[SPI] SPI_Open State == STATE_INIT
[SPI] SPI STATE : SPI_IOCTL_START
SPIConfig Prescaler = 1.
[SPI] pSpiPrivate->dwMode = 1
SPIConfig successful.
SPIWriteReg byReg[0] = 0x18. byReg[1] = 0x80
[SPI] SPI_Write pSpiPrivate->State = 10
[SPI] pBuffer : 0xD02FE8C4, Count : 2
[SPI] g_pMappedEmbedded 0xd02fe8c4
[SPI] g_pMarshalled 0xd02fe8c4
[SPI] ThreadForTx pSPIregs = b2b0c000
[SPI] pTxBuffer : 0xD02FE8C4, dwTxCount : 2
[SPI] HS SPI reset
[SPI] Thread for TX : USE INT
[SPI] Thread for TX : MASTER MODE
[SPI] SPI_Write : Return Value : 2
//第一次写完成,下面开始读
[SPI] SPI_Write pSpiPrivate->State = 10
[SPI] pBuffer : 0xD02FE8A4, Count : 1
[SPI] g_pMappedEmbedded 0xd02fe8a4
[SPI] g_pMarshalled 0xd02fe8a4
[SPI] ThreadForTx pSPIregs = b2b0c000
[SPI] pTxBuffer : 0xD02FE8A4, dwTxCount : 1
[SPI] HS SPI reset
[SPI] Thread for TX : USE INT
[SPI] Thread for TX : MASTER MODE
[SPI] SPI_Write : Return Value : 1
[SPI] SPI_Read pSpiPrivate->State = 10
[SPI] pBuffer : 0xD02FE8AC, Count : 1
[SPI] g_pMappedEmbedded 0xd02fe8ac
[SPI] g_pMarshalled 0xd02fe8ac
[SPI] pRxBuffer : 0xD02FE8AC, dwRxCount : 1
[SPI] HS SPI reset
[SPI] Thread for RX : USE INT
[SPI] Thread for RX : MASTER MODE
[SPI] SPI_Read : Return Value : 1
//读出来的数据是错误的
SPIReadReg byReg = 0x98. byOutData = 0xec
LCR = 0xec.
//接下来第二组写,就写不进去了!
SPIWriteReg byReg[0] = 0x0. byReg[1] = 0xc
[SPI] SPI_Write pSpiPrivate->State = 10
[SPI] pBuffer : 0xD02FE8C4, Count : 2
[SPI] g_pMappedEmbedded 0xd02fe8c4
[SPI] g_pMarshalled 0xd02fe8c4
[SPI] ThreadForTx pSPIregs = b2b0c000
[SPI] pTxBuffer : 0xD02FE8C4, dwTxCount : 2
[SPI] HS SPI reset
[SPI] Thread for TX : USE INT
[SPI] Thread for TX : MASTER MODE