s3c6410 spi转uart通讯 wince

jellyfan0885 2012-11-06 03:59:04
板子是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



...全文
674 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xqhrs232 2014-08-19
  • 打赏
  • 举报
回复
直接用SPI接口好了
xiaoyao1004 2014-08-19
  • 打赏
  • 举报
回复
我最近也在做一个关于SPI转串口的,用的是主控芯片是IMX515,转换芯片是max3100,wince系统,有人做过吗?求指点啊?
dengchonglin 2014-08-19
  • 打赏
  • 举报
回复
引用 8 楼 xiaoyao1004 的回复:
我最近也在做一个关于SPI转串口的,用的是主控芯片是IMX515,转换芯片是max3100,wince系统,有人做过吗?求指点啊?
大佬, 硬件 SPI 不熟悉, 为何不用软件 SPI 呢?? 自己模拟 CLK MOSI MISO 不就完啦?? 搞那么大动静!
jellyfan0885 2012-11-12
  • 打赏
  • 举报
回复
引用 6 楼 puyoupuyou 的回复:
调过6410的SPI转串口 ,用过官方BSP驱动,也自己写过SPI驱动,分享一下。 SPI CLK MOSI CS控制是否正确,首先看gpc这几个控制寄存器是否正确,其次再确认SPI的clk gate是否打开了,CLK source是否正确,SPI中断是否正确 。如果有CLK但通讯不正确,就要看扩展芯片的datasheet了 SPI通讯的CPOL CPHA是怎么设置的,max clk,等等。可以……
谢谢您说的这么详细,我现在在示波器上可以抓到时钟,片选,写的数据,但是读的时候都是0XFF,第一次写完,再读出来就是0xff,然后第二次写的时候就在写的while里循环了,提示是数据线上一直有数据。 我分析还是读的时候有问题,导致的第二次的写有问题! 您能帮我分析下读哪里会出问题吗?谢谢!
puyoupuyou90 2012-11-11
  • 打赏
  • 举报
回复
调过6410的SPI转串口 ,用过官方BSP驱动,也自己写过SPI驱动,分享一下。 SPI CLK MOSI CS控制是否正确,首先看gpc这几个控制寄存器是否正确,其次再确认SPI的clk gate是否打开了,CLK source是否正确,SPI中断是否正确 。如果有CLK但通讯不正确,就要看扩展芯片的datasheet了 SPI通讯的CPOL CPHA是怎么设置的,max clk,等等。可以找一个寄存器,写什么数据就能读出相同的数据,验证SPI通讯是否成功。我就是用这种方式验证SPI扩展芯片工作是否正常的。
David_Hu 2012-11-07
  • 打赏
  • 举报
回复
SPI驱动没有读写接口吗,要自己封装? 一个SPI驱动还涉及到中断甚至DMA 不过一般是有读写接口的,你只需关心接口就行了,真要自己实现的话,看的问题就多了
九个太阳2023 2012-11-07
  • 打赏
  • 举报
回复
以前做过16C554扩展串口的 SPI转串口没有做过
jungouhaha 2012-11-07
  • 打赏
  • 举报
回复
没做过,扩展倒是有专门的串口扩展芯片做过的
引用 2 楼 jellyfan0885 的回复:
引用 1 楼 jungouhaha 的回复:6410要SPI有SPI,要UART有UART,要搞一个SPI转UART,所谓何求? 楼上的,我们外围还需要4个UART,自带的uart不够用啊! 用示波器根本量不出来任何时钟数据,看来还需要在别的地方找原因! 有做过SPI的请帮帮忙吧!
jellyfan0885 2012-11-07
  • 打赏
  • 举报
回复
引用 1 楼 jungouhaha 的回复:
6410要SPI有SPI,要UART有UART,要搞一个SPI转UART,所谓何求?
楼上的,我们外围还需要4个UART,自带的uart不够用啊! 用示波器根本量不出来任何时钟数据,看来还需要在别的地方找原因! 有做过SPI的请帮帮忙吧!
jungouhaha 2012-11-07
  • 打赏
  • 举报
回复
6410要SPI有SPI,要UART有UART,要搞一个SPI转UART,所谓何求?

19,524

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧