如果设置为主机,我在运行例程时的时钟和数据是对的,但是片选却对不上,例程代码:
#include <cdefBF533.h>
unsigned char buff_w[512];
unsigned char buff_r[512];
void Init_SDRAM(void)
{
*pEBIU_SDRRC = 0x00000817;
*pEBIU_SDBCTL = 0x00000013;
*pEBIU_SDGCTL = 0x0091998d;
ssync();
}
void Init_EBIU(void)
{
*pEBIU_AMBCTL0 = 0x7bb07bb0;
*pEBIU_AMBCTL1 = 0xffc07bb0;
*pEBIU_AMGCTL = 0x000f;
}
void Set_PLL(int pmsel,int pssel)
{
int new_PLL_CTL;
*pPLL_DIV = pssel;
asm("ssync;");
new_PLL_CTL = (pmsel & 0x3f) << 9;
*pSIC_IWR |= 0xffffffff;
if (new_PLL_CTL != *pPLL_CTL)
{
*pPLL_CTL = new_PLL_CTL;
asm("ssync;");
asm("idle;");
}
}
void SPI_init(void)
{
*pSPI_BAUD=2; //配置速率为1/4系统时钟 SPI速率 = SCLK/2*SPI_BAUD
*pSPI_FLG |=FLS2; //选择SPISEL2接口
*pSPI_CTL = 0x1001|CPHA| CPOL; //配置模式为手动片选模式
*pSPI_CTL = (*pSPI_CTL | SPE); //使能SPI接口
}
int main()
{
int i;
Set_PLL(16,4);
Init_EBIU();
SPI_init();
*pSPI_FLG &= ~FLG2; //将SPISEL2拉到0
while(!(*pSPI_STAT & SPIF)); //查看SPI传输状态是否完成
*pSPI_TDBR = 0x55; //将数据送入SPI传输数据寄存器
*pSPI_FLG |= FLG2; //将SPISEL2拉到1,完成数据传输
*pSPI_FLG &= ~FLG2;
while(*pSPI_STAT & RXS)//查看SPI传输状态是否有数据需要接收
i = *pSPI_RDBR; //读取数据
*pSPI_FLG |= FLG2;
while(1);
}
如果在中间加入延时,或者改动则时序可能出错,是不是硬件的问题??
「该帖子被 eggplant 在 2013-11-01 22:23:01 编辑过」