查看: 2703|回复: 2

[其他] 折磨我一周的SPI终于有了结果,有些问题还是比较疑惑,大家看看有何高见。

[复制链接]

该用户从未签到

4

主题

39

帖子

0

注册会员

Rank: 2

积分
119
最后登录
1970-1-1
发表于 2012-6-5 11:26:58 | 显示全部楼层 |阅读模式
硬件是用s12的SPI0(用M口)读sst25vf080b。经过一番研究肯定了两件事:
1. s12兼容3.3伏期件。2.相位设置应为CPOL=1;CHPA=1.
问题出在函数上,发送字节函数
byte SM1_SendChar(SM1_TComData Chr)
{ if (!SPI0SR_SPTEF) {/* Is last character send? */
    return ERR_TXFULL; /* If no then return error */
  }
  SPI0DR = Chr;                        /* Send character */
  return ERR_OK;                       /* OK */
}
读函数
byte SM1_RecvChar(SM1_TComData *Chr)
{
  if (!(SPI0SR & SPI0SR_SPIF_MASK)) { /* Is receive buffer empty? */
    return ERR_RXEMPTY;                /* If yes then error is returned */
  }
  *Chr = SPI0DR;                       /* Read data from receiver */
  return ERR_OK;
}
主程序调用如下:
void rd25vfsr(byte *psr){
   FCS = 1;     //flash SPI CE
   FCS = 0;
   SM1_Error = SM1_SendChar(RDSR);   //发送读状态寄存器命令
   SM1_Error = SM1_SendChar(DUMCHAR);    //发送无用字节,以便从机返回状态内容
   SM1_Error = SM1_RecvChar(psr);
   FCS = 1;     
  }
失败。而改造发送函数如下
byte SM2_SendChar(SM1_TComData Chr, byte *p)
{
  if (!SPI0SR_SPTEF) {         /* Is last character send? */
    return ERR_TXFULL;           /* If no then return error */
  }
  SPI0DR = Chr;                  /* Send character */
  if (!SPI0SR_SPTEF) {          /* Is last character send? */
    return ERR_TXFULL;          /* If no then return error */
  }
  SPI0DR = 0;   
  if (!SPI0SR_SPTEF) {           /* 这个可以去掉,但如果改成 */
    return ERR_TXFULL;         /* if (SPI0SR_SPIF),也会失败*/
  }
     *p = SPI0DR;
  return ERR_OK;                       /* OK */
}
才能接收到数据,既发送完请求要马上发送无用字节,以便读出,这可能由于flash芯片的原因。
总之,感觉SPIF位只在传送完后,几个机器周期内有效(为1),而不是像某些书中写的读SPISR再读SPIDR清零,而是自己在发送数据后(包括为接收的发送)很快自动清零。
希望做过SPI的指点。
我知道答案 目前已有1人回答
回复

使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2012-6-5 16:19:21 | 显示全部楼层

    RE:折磨我一周的SPI终于有了结果,有些问题还是比较疑惑,大家看看有何高见。

    SPI数据接收的时候,当数据读取完毕以后,会自动清零。数据发送完毕以后,发送寄存器会清零。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    39

    帖子

    0

    注册会员

    Rank: 2

    积分
    119
    最后登录
    1970-1-1
     楼主| 发表于 2012-6-6 09:12:07 | 显示全部楼层

    RE:折磨我一周的SPI终于有了结果,有些问题还是比较疑惑,大家看看有何高见。

    哦,是这样。
    还有就是SPI0SR_SPIF位,好像是受调试器影响。并不像我前面说的自动回零。不要误导大家^_^
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-13 13:31 , Processed in 0.094878 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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