关于2440 spi的一些疑问!!!!
这两天搞2440的SPI驱动,感觉有很多疑问,请大家帮忙解答!!!
我现在2440的SPI1采用从模式,单片机通过模拟SPI接口与其通信。当2440要发送数据的时候,就给单片机一个外部中断脉冲,而当单片机要发送数据的时候会去检测2440的一个I/O 口是不是拉高(也就是说虽然单片机是主模式,但是2440具有数据传输的控制权)。
我的2440 SPI1 的配置如下:
///interrupt mode,disable sck,slave,active low,formatB,normal mode
g_pCHPSPIregs->SPCON1 = (0x1<<5)|(0x0<<4)|(0x0<<3)|(0x1<<2)|(0x1<<1)|(0x0<<0);
现在的情况是,2440发送4个字节的数据给单片机,每发送一个字节给一个中断脉冲,在往SPITDAT1写数据之前判断是否有写冲突,是否ready!结果发第一个字节的时候没问题,发第二字节之前检测发现写冲突标志置位,第三和第四个字节之前又没有写冲突。
if(g_pCHPSPIregs->SPSTA1 & 0x4) RETAILMSG(1, (TEXT("MULTI MASTER COLLISON!!!")));
while((g_pCHPSPIregs->SPSTA1 & 0x01)==0);// wait while busy
///reverse the byte
g_pCHPSPIregs->SPTDAT1 = *pSrc;// write left justified data
我的疑问有三点:
1.写冲突应该是指在SPI的传输过程中,又往SPITDAT1写了数据。这就很奇怪了,单片机那边肯定没有往2440写数据,而且每次写之前都判断了ready位,怎么会出现写冲突,而且只出现一次????
2.2440的手册感觉关于SPI部分写的不是很清楚,SPCONn 的Tx Auto Garbage Data mode enable(TAGD)位为0的时候,要手动发0xff,像我这种和模拟的SPI口通信也要发吗?
3.SPI的ready位Transfer ReadyFlag (REDY)指示SPI的传输或者接收ready,为什么接收和发送用一个位来指示??这样不是很难判断当前到底是接受ready还是发送ready?????
4.2440的SPCONn的SPI Mode Select(SMOD)选择位,手册上的说明是:Determine how SPTDAT is read/written,这就很奇怪了,这位只设置SPTDAT位的工作方式,那SPRDAT的工作方式呢?
[解决办法]
我的疑问有三点:
1.写冲突应该是指在想SPI数据发送,发现SPI发送数据寄存器中有数据,还没有发送完成。
一般while((v_pSPIPregs->rSPSTA0 &0x01)==0);等待
2.2440的手册感觉关于SPI部分写的不是很清楚,SPCONn 的Tx Auto Garbage Data mode enable(TAGD)位为0的时候,要手动发0xff,像我这种和模拟的SPI口通信也要发吗?
我在做两个2440 SPI双机通信的时候,如果作为主机,是要写0XFF的
3.SPI的ready位Transfer ReadyFlag (REDY)指示SPI的传输或者接收ready,为什么接收和发送用一个位来指示??这样不是很难判断当前到底是接受ready还是发送ready?????
没有用到这个ready位啊?2440有这个么?
4.2440的SPCONn的SPI Mode Select(SMOD)选择位,手册上的说明是:Determine how SPTDAT is read/written,这就很奇怪了,这位只设置SPTDAT位的工作方式,那SPRDAT的工作方式呢?
SPI Mode Select(SMOD)就是数据传输的工作方式啊,也是SPI的工作方式啊
SPI的主机从机设置是Master/Slave Select (MSTR)
谁做主机谁提供时钟
[解决办法]