SPI读写函数

2019-07-20 20:14发布

u8 SPI2_ReadWriteByte(u8 TxData)
{                                          

  while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET){}
       
        SPI_I2S_SendData(SPI2, TxData);
               
  while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET){}

        return SPI_I2S_ReceiveData(SPI2);
                    
}


void spi2_write(u8 txdata)
{
        while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
        SPI_I2S_SendData(SPI2, txdata); //í¨1yíaéèSPIx·¢Ëíò»¸öbyte  êy¾Y
}

//spi read function
u8 spi2_read(void)
{
        while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
        return (u8)SPI_I2S_ReceiveData(SPI2);
}

分开写的时候总是卡在接收缓存区为空的循环里,读不了数据是怎么回事?一定要写一起?读数据之前总是要先发送数据吗?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
xuande
1楼-- · 2019-07-20 23:19

常规的SPI,发送与接收是同步完成的,
必须有发送,才会有收到。
你如果用这种方式,那必须先发送。

但芯片有个单线(好像是这名字)模式,不用发送就可以收,属于非常规了。

zhoujianwen
2楼-- · 2019-07-20 23:38
xuande 发表于 2016-9-7 11:12
常规的SPI,发送与接收是同步完成的,
必须有发送,才会有收到。
你如果用这种方式,那必须先发送。

frame_lengh=  某一帧的长度;
        frame_integer=frame_lengh/256;           取整,因为一次只能写256字节
        frame_remainder=frame_lengh%256;          取余,看看有没有余数或者帧小于256字节的情况
        frame_end=256*frame_integer;
        for(j=0;j<frame_integer;j++)    如果帧长度大于256字节执行
                {
                        SPI_START;
                        SPI2_ReadWriteByte(0x06);                //spi WREN command
                        SPI_END;
                        SPI_START;
                        SPI2_ReadWriteByte(0x02);                //0x02 is page Program command
                        SPI2_ReadWriteByte((unsigned char)(progaddr>>16));
                        SPI2_ReadWriteByte((unsigned char)(progaddr>>8));
                        SPI2_ReadWriteByte((unsigned char)progaddr);
                        for(i=0;i<256;i++)
                        {
                                SPI2_ReadWriteByte(zhenshuzu[8+i+256*j]);
                        }
                        SPI_END;
                        while((W25X80_ReadSR()&0x01)==0x01);
                        SPI_END;
                        progaddr+=256;
                }
        if(frame_remainder)      如果有余数或者帧长度小于256字节
                {
                        SPI_START;
                        SPI2_ReadWriteByte(0x06);                //spi WREN command
                        SPI_END;
                        SPI_START;
                        SPI2_ReadWriteByte(0x02);                //0x02 is page Program command
                        SPI2_ReadWriteByte((unsigned char)(progaddr>>16));
                        SPI2_ReadWriteByte((unsigned char)(progaddr>>8));
                        SPI2_ReadWriteByte((unsigned char)progaddr);
                        for(i=0;i<frame_remainder;i++)
                                SPI2_ReadWriteByte(fcl_control_sys[8+frame_end+i]);
                        SPI_END;
                        while((W25X80_ReadSR()&0x01)==0x01);   // μè′yBUSY&#206;&#187;&#199;&#229;&#191;&#213;
                        SPI_END;
                        progaddr+=frame_remainder;
                }
        reply_ack(udppcb,addr,port);
}

大神,为什么帧长度大于256执行上面那个for循环的时候,总是卡死在SPI读写函数里面?我仿真进去,有一个i的值是67,有一次是157,但是两次的j的值都是0,SPI读写函数卡在接收标志那里。


但是帧长度小于256,我只发过52字节长度的帧,执行下面的函数不会出错,不会卡死。
这是什么情况呢?这函数都一样的啊。。。。

zhoujianwen
3楼-- · 2019-07-21 02:15
我要哭死了,最后发现变量i的定义太小,每次大于256的时候就出错了,我那个擦!!引以为鉴!!

弱弱问一句,如果溢出的话i等于多少啊、

一周热门 更多>