打印
[ZLG-ARM]

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

[复制链接]
3671|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
21班猪|  楼主 | 2007-12-14 03:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
lg, AC, TE, TI, rc
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);
}

相关帖子

沙发
hotpower| | 2007-12-14 06:59 | 只看该作者

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

菜地早发现此问题: https://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;
    }
  }
}

相关链接:http://blog.**/hotpower/68890/message.aspx

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

90

帖子

0

粉丝