chenyl 发表于 2023-6-29 10:41:47

读不到外置flash设备ID,不知道什么原因

u8GD25Q20ETIGR_ID, GD25Q20ETIGR_ID1, GD25Q20ETIGR_ID2;


void SPI_Init(void)
{
      SPCTL |=(1 << 7); //忽略 SS 引脚功能,使用 MSTR 确定器件是主机还是从机
      SPCTL |=(1 << 6); //使能 SPI 功能
      SPCTL &= ~(1 << 5); //先发送/接收数据的高位( MSB)
      SPCTL |=(1 << 4); //设置主机模式
      SPCTL &= ~(1 << 3); //SCLK 空闲时为低电平,SCLK 的前时钟沿为上升沿,后时钟沿为下降沿
      SPCTL &= ~(1 << 2); //数据 SS 管脚为低电平驱动第一位数据并在 SCLK 的后时钟沿改变数据
      SPCTL = (SPCTL & ~3) | 0;   //SPI 时钟频率选择, 0: 4T, 1: 8T,2: 16T,3: 32T
      P_SW1 = (P_SW1 & ~(3<<2)) | (1<<2);   //IO口切换. 0: P1.2/P5.4 P1.3 P1.4 P1.5, 1: P2.2 P2.3 P2.4 P2.5, 2: P5.4 P4.0 P4.1 P4.3, 3: P3.5 P3.4 P3.3 P3.2

      SPI_CLK = 0;    // set clock to low initial state
      SPI_SI = 1;
      SPSTAT = SPIF + WCOL;   //清0 SPIF和WCOL标志
}

void FlashCheckID(void)
{
    SPI_CS = 0;
    send_byte(0x90);      //发送读取ID命令
    send_byte(0x00);            //空读3个字节
    send_byte(0x00);
    send_byte(0x00);
    GD25Q20ETIGR_ID1 = receive_byte();         //读取制造商ID1
    GD25Q20ETIGR_ID= receive_byte();         //读取设备ID
    GD25Q20ETIGR_ID2 = receive_byte();         //读取制造商ID2
    SPI_CS = 1;
       
    if(GD25Q20ETIGR_ID1 == 0xC8 ||GD25Q20ETIGR_ID == 0xC8||GD25Q20ETIGR_ID2 == 0xC8)
                printf("read success..\n");

}

void main() {
        // 初始化SPI
        SPI_Init();
        FlashCheckID();
        FlashCheckID();
}

hsrzq 发表于 2023-6-29 14:44:27

哪个型号的外置spi设备?

zhp 发表于 2023-6-29 16:20:38

是什么型号的单片机?I/O是否有进行初始化?
STC8、STC32系列的单片机,上电后所有I/O都是高阻输入模式
是无法对外输出电平信号的

chenyl 发表于 2023-6-29 19:43:02

已经解决,每次在读或者写之后都要进行SPSTAT = SPIF + WCOL;   //清0 SPIF和WCOL标志这个动作,不然会出错
页: [1]
查看完整版本: 读不到外置flash设备ID,不知道什么原因