原创 关于周立功213X的SSP例程应该说明的问题

2007-12-14 07:10 5435 8 9 分类: MCU/ 嵌入式

http://bbs.21ic.com/club/bbs/ShowAnnounce.asp?id=2793459



21班猪 发表于 2007-12-14 03:50 ZLG-ARM ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

楼主: ZLG 213X的SSP例程会害死人的.


unsigned char SSP_SendData(unsigned char  data)
{  
//    IOCLR = SLAVE_CS;                    // Ñ¡Ôñ´Ó»ú   
    SSPDR = data;
    while( (SSPSR & 0x01)==0 );        // µÈ´ýTFEÖÃ룬¼´·¢ËÍFIFO¿Õ   
//    IOSET = SLAVE_CS;
    return(SSPDR);
}

大家发觉有什么问题没有?

刚开始用时就怀疑有问题的,后来使用证实确实存在问题,
不应该发送FIFO空就返回数据。应该SSP空闲时反回数据
unsigned char SSP_SendData(unsigned char  data)
{  
//    IOCLR = SLAVE_CS;                    // Ñ¡Ôñ´Ó»ú   
    SSPDR = data;
    while( (SSPSR & 0x10) );        // µÈ´ýTFEÖÃ룬¼´·¢ËÍFIFO¿Õ   
//    IOSET = SLAVE_CS;
    return(SSPDR);
}




blank.gif

mood25.gif hotpower 发表于 2007-12-14 06:59 ZLG-ARM ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

2楼: 哈哈~~~1年半前菜地已经遇到和指出过此问题了~~~


菜地早发现此问题: http://bbs.21ic.com/club/bbs/ShowAnnounce.asp?id=2140869
unsigned char AdsObj::AdsReadWriteByte(unsigned char cData)
{
  SSP->SSP_DR = cData;
//  while( !(SSP->SSP_SR & (1 << TFE)) );// 等待TFE置位,即发送FIFO空   
//应该改为:
  while( SSP->SSP_SR & (1 << BSY) );// 等待BSY清零,即控制器空闲   
  return SSP->SSP_DR;
}


不过IAR的例程为通过验证没问题)

/*************************************************************************
* Function Name: MmcTranserByte
* Parameters: Int8U ch
* Return: Int8U
*
* Description: Read byte from SPI
*
*************************************************************************/
Int8U MmcTranserByte (Int8U ch)
{
  while(!SSPSR_bit.TNF);
  SSPDR = ch;
  while(!SSPSR_bit.RNE);
  return((Int8U)SSPDR);
}

/*************************************************************************
* Function Name: MmcSendBlock
* Parameters: pInt8U pData, Int32U Size
*
* Return: void
*
* Description: Read byte from SPI
*
*************************************************************************/
void MmcSendBlock (pInt8U pData, Int32U Size)
{
Int32U OutCount = Size;
  while (OutCount)
  {
    while(SSPSR_bit.TNF && OutCount)
    {
      SSPDR = *pData++;
      --OutCount;
    }
  }
  while (SSPSR_bit.RNE || !SSPSR_bit.TFE)
  {
    volatile Int32U Dummy = SSPDR;
  }
}

/*************************************************************************
* Function Name: MmcReceiveBlock
* Parameters: pInt8U pData, Int32U Size
*
* Return: void
*
* Description: Read byte from SPI
*
*************************************************************************/
void MmcReceiveBlock (pInt8U pData, Int32U Size)
{
Int32U Delta = 0;
  while (Size || Delta)
  {
    while(SSPSR_bit.TNF && (Delta < SSP_FIFO_SIZE) && Size)
    {
      SSPDR = 0xFF;
      --Size; ++Delta;
    }
    while (SSPSR_bit.RNE)
    {
      *pData++ = SSPDR;
      --Delta;
    }
  }
}



ADS7870的LPC213X之SSP接口配置及应用

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户158978 2009-4-14 08:06

谢谢,非常好,按照原来的的历程,我来驱动LED显示要多发送一个字节,才能正常显示,百思不得其解,楼主我爱你。
相关推荐阅读
雁塔菜农 2012-04-05 17:51
2012年度新唐Cortex-M0助学开发套件有约束条件赠送申报贴
2012年度新唐Cortex-M0助学套件从4月起每月有约束条件发放16套。 申报人必须是21ic或 EDNC 会员 并具备1月的会龄。 申报时必须注明“遵守约束条件,缴纳250元订金,上...
雁塔菜农 2012-04-05 17:04
2012年度Cortex-M0助学园地推广框图
...
雁塔菜农 2012-04-01 17:59
2012年度Cortex-M0助学园地奖励计划细则
抢楼请点击:菜地公告:即日起创建《菜农Cortex-M0助学园地》(盖楼入口) 每月10号和25号的下午2:50进行2次抢楼,规则同去年12月的疯狂抢楼活动。 奖品由21IC、北航、广州迪圣...
雁塔菜农 2012-02-03 08:19
菜农谋略:搞定牛人宋俊德,对女牛人孙昌旭说:“记住,俺是雁塔菜农~~~ ”
http://www.baidu.com/s?wd=%B2%CB%C5%A9%D0%A6%CC%B8%A1%B6%D0%C2%C0%CB%C3%FB%C8%CB%D0%A7%D3%A6%A1%B7...
EE直播间
更多
我要评论
1
8
关闭 站长推荐上一条 /3 下一条