标题: 单片机模拟SPI读数据,读到的电平一直为0 [打印本页]

作者: ywzqdpj    时间: 2023-3-17 22:08
标题: 单片机模拟SPI读数据,读到的电平一直为0
单片机用的是dspic33fj256mc710a,eeprom用的是at25128,spi通信;
在在线调试的时候正常,可以正常读取,正常写入;
但是下载程序到板子里面运行就不行,从eeprom里面读的数据都是0x00,通过逻辑分析仪抓波形发现eeprom已经发出了正确的回复,但是读取的时候全部是0x00;
也就是说,虽然eeprom发出了正确的信息,但是我的soft SPI读取函数里面读到的都是0,经过数据发现进入(SI == 1)的条件下语句0次,进入else的语句8次,所以在代码里面读取电平不是为高电平的(我用逻辑分析测了PIC单片机引脚端的电平,确实是有变化的正确电平)

正常结果.png (18.6 KB, 下载次数: 48)

正常结果.png

下载程序EEPROM有正确输出.png (68.56 KB, 下载次数: 48)

下载程序EEPROM有正确输出.png

错误结果.png (20.56 KB, 下载次数: 50)

错误结果.png

代码.png (102.48 KB, 下载次数: 47)

代码.png

作者: Y_G_G    时间: 2023-3-18 21:54
25系列的EEPROM的基本操作几乎是完全一样的
CS的时序很重要的
这是一个写入函数,你参考一下
void Write_Data_25AA(u8 WriteByte,u8 Addr)//向指定地点写入一个字节的数据
{
        u8 i;       
       
        CS_SPI_LOW;                                                                                                                                                //CS=0
        SPI_Write_Byte(WREN);                                                                                                        //写入"写使能命令"
        CS_SPI_HI;                                                                                                                                                //CS=1       
        delay_us(10);                                                                                                                                        //延时
       
        CS_SPI_LOW;                                                                                                                                                //CS=0
        SPI_Write_Byte(WRITE);                                                                                                //写入"写命令"
        SPI_Write_Byte(Addr);                                                                                                        //SPI写入地址
        SPI_Write_Byte(WriteByte);                                                                                //写入数据
        CS_SPI_HI;                                                                                                                                                //CS=1,写入之后要把CS拉高,才能完成写入
        delay_us(10);                                                                                                                                        //延时
       
        do
        {               
                CS_SPI_LOW;                                                                                                                                        //CS=0
                SPI_Write_Byte(RDSR);                                                                                                //写入读取STATUS状态位命令
                i=SPI_Read_Byte();                                                                                                        //读取STATUS状态位中的:写使能位=WEL,此位为1时,可以写入
                CS_SPI_HI;                                                                                                                                        //CS=1
        }                                                                                                                                                                                        //读取STATUS状态位中的:写进行位=WIP,此位为1时,正在写入
        while(i&0x01);                                                                                                                        //等待写进行位变成0*/               
}


作者: ywzqdpj    时间: 2023-3-19 19:57
Y_G_G 发表于 2023-3-18 21:54
25系列的EEPROM的基本操作几乎是完全一样的
CS的时序很重要的
这是一个写入函数,你参考一下

应该不是逻辑的问题,我试了下,在“下载程序”后,这个引脚读高电平根本读不出来。在仿真的时候可以读出高电平。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1