|
使用lpc2148的io口模拟SPI总线时读出来的数据全部是0,而用它自带的SPI则读出来的全部是1,部分代码如下,
uint8 ReadSPI(void)
{
uint8 n=8;
uint8 tdata=0;
IO0CLR=SCK;
while(n--)
{
delay(5);
delay(5);
IO0SET=SCK;
tdata=tdata<<1;
if(IO0PIN&SO==1)
{
tdata= tdata|0x01;
}
else
{
tdata=tdata&0xfe;
}
IO0CLR=SCK;
}
return tdata;
}
/*************************************
**** 发送一个字节 ****
***************************************/
void WriteSPI(uint8 ch)
{
uint8 n=8;
IO0CLR=SCK;
while(n--)
{
delay(5);
IO0CLR=SCK;
if((ch&0x80)==0x80)
{
IO0SET=SI;
}
else
{
IO0CLR=SI;
}
delay(5);
IO0SET=SCK;
delay(5);
ch=ch<<1;
}
}
/***********************************************************
函数名:SPISend()
功能:SPI发送数据
说明: SPI总线读写
入口参数:dat
返回值:无
***************************************************************/
void SPISend(uint8 dat)
{
if((S0SPSR&0X40)==0)
{
S0SPDR = dat;
while((S0SPSR&0X80)==0);
}
}
/***********************************************************
函数名:SPIRece()
功能:SPI接收数据
说明: SPI总线读写
入口参数:dat
返回值:无
***************************************************************/
uint8 SPIRece(void)
{
uint8 dat;
S0SPDR=0x00;
while((S0SPSR&0X80)==0);
dat=S0SPDR;
return (dat);
}
void SPIInit(void)
{
IO0DIR |=1<<7;
IO0SET = 1<<7;
PINSEL0 = (PINSEL0&0xFFFF00FF)|0x00001500;
S0SPCCR = 0X52;
S0SPCR =(0<<3) | //CPHA=0,数据在SCK的第一个时钟沿采样
(0<<4) | //CPOL=1,SCK为低有效
(1<<5) | //MSTR=1,SPI处于主模式
(0<<6) | //LSBF=0,SPI数据传输MSB(位7)在先
(0<<7) ; //SPIE=0,SPI中断被禁止
void SPISend(uint8 dat)
{
if((S0SPSR&0X40)==0)
{
S0SPDR = dat;
while((S0SPSR&0X80)==0);
}
},请问下是什么原因啊,是不是程序问题还是硬件问题啊? |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|