打印
[STM8]

求助贴:让人纠结的STM8S之SPI

[复制链接]
1524|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 liubin1109 于 2013-4-2 00:52 编辑

调了老半天,咋就错开一个byte呢?

请看程序:
void ISP_Write(uchar *a,uchar n)  //写8个位//这个函数没问题
{
    for(;n>0;n--)
    {
        while(!SPI_SR_TXE);        //如果发送缓冲区非空则等待发送完
        SPI_DR = *a;              //内存地址的数据移到发送缓冲区
        a++;                          //内存地址加1
    }
}
void ISP_Read(uchar b)            //写一个指令b=0x1E,返回3个8位数据
{
    uchar i;
    PE_ODR_ODR5 = 0;
    ISP_Write(&b,1);
    while(!SPI_SR_TXE);            //如果发送缓冲区非空则等待发送完
    for(i=1;i<4;i++)
    {
        SPI_DR;
        while(!SPI_SR_TXE);       //如果发送缓冲区非空则等待发送完
      SPI_DR = 0xFF;             //假写
      while(!SPI_SR_RXNE);    //接收缓冲区为空,等待接收完
      buf=SPI_DR;             //数组有buf[4];//接收到的数据放在buf[1]~[3];
    }
    while(SPI_SR_BSY);            //等待通讯结束
    PE_ODR_ODR5 = 1;            //CS释放为高
}

结果请看下图:


把程序修改成:
for(i=0;i<3;i++)
    {
        SPI_DR;
        while(!SPI_SR_TXE);       //如果发送缓冲区非空则等待发送完
        SPI_DR = 0xFF;          //假写
        while(!SPI_SR_RXNE); //接收缓冲区为空,等待接收完
        buf=SPI_DR;           //数组有buf[4];//接收到的数据放在buf[1]~[3];
    }
    while(!SPI_SR_RXNE);         //接收缓冲区为空,等待接收完
    buf[3]=SPI_DR;
    while(SPI_SR_BSY);            //等待通讯结束
    PE_ODR_ODR5 = 1;            //CS释放为高
看起来是正常,可不明白这是为什么!结果请看下图:

沙发
王紫豪| | 2013-4-1 22:52 | 只看该作者
ISP 和 SPI两码事,错开一个 byte,还是一个 bit?

使用特权

评论回复
评论
liubin1109 2013-4-3 12:45 回复TA
... 
板凳
liubin1109|  楼主 | 2013-4-2 00:54 | 只看该作者
王紫豪 发表于 2013-4-1 22:52
ISP 和 SPI两码事,错开一个 byte,还是一个 bit?

谢谢版主关注,是错开1个字节/8个bit,标志打错了。自我反省一下~

现在在for前面加上while(SPI_SR_BSY);解决了,看来不能完全依赖SPI_SR_TXE和SPI_SR_RXNE两个标志位来判断MOSI、MISO线上的字节是否发送/接收完毕
不知道这样理解对不对?

使用特权

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

本版积分规则

个人签名:116209137,TP,触摸,电源,逆变。

251

主题

323

帖子

2

粉丝