搜索
bottom↓
回复: 5

请教关于LPC2148的SPI接口问题

[复制链接]

出0入0汤圆

发表于 2011-4-1 22:37:43 | 显示全部楼层 |阅读模式
使用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, 杜汶泽)

出0入0汤圆

发表于 2011-4-1 22:49:25 | 显示全部楼层
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;
}
上面函数中有错误!
如果SO宏不是1,那么if(IO0PIN&SO==1)条件永远不会成立,因此读出来都是0也不足为奇了。此外,还有楼主的习惯应该改一下,否则错误会隐藏在你以后写的代码中,原因是:“&”位运算符的优先级比“==”逻辑运算符还低,即使按照你错误的意思也应该写为if((IO0PIN&SO)==1)。
不罗嗦了,正确的写法是:if(IO0PIN&SO){...}

出0入0汤圆

发表于 2011-4-1 22:52:07 | 显示全部楼层
发送和接收短接后测试

出0入0汤圆

发表于 2011-4-1 23:06:13 | 显示全部楼层
回复【楼主位】bulaimeimrz
-----------------------------------------------------------------------

再啰嗦一下,既然tdata先被初始化成0了,那么while循环中的
else
  {
  tdata=tdata&0xfe;
  }
就实在没必要了!

出0入0汤圆

 楼主| 发表于 2011-4-2 11:34:08 | 显示全部楼层
回复【1楼】9509238
-----------------------------------------------------------------------

多谢指教了,今后一定会改,不过我还是不明白“如果SO宏不是1,那么if(IO0PIN&SO==1)条件永远不会成立,因此读出来都是0也不足为奇了”这句话的意思,还有就是我改了之后发现读出来的全部是1了,数据也没有正确啊,这又是为什么呢?

出0入0汤圆

 楼主| 发表于 2011-4-2 11:35:25 | 显示全部楼层
回复【2楼】bj-stm8 珍惜生命 远离天_朝
-----------------------------------------------------------------------

短接后发送后如果来不及接收,会不会就出现错误或丢失呢?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 01:36

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表