欢迎光临散文网 会员登陆 & 注册

江科大学习笔记 _14.软件SPI

2023-06-28 20:07 作者:自闭选手的Z23  | 我要投稿



 


 


W25Q64:地址宽度24位,3字节 8M->块->扇区->页

  8 * 1024 *1024 范围:00 00 00H--7F FF FFH (8MB)

 

8M分为128个块,每个块(64K) 块0-块127,

(8*1024 *1024 /64*1024) = 128 范围:xx 00 00 H--xx FF FFH(64KB)

 

64K分为16个扇区,每个扇区(4k),扇区0--扇区15

(64*1024/4*1024) = 16 范围:xx x0 00h -- xx xF FFh (4KB)

 

4K分为16个页,每个页(256字节),页0--页15

(4*1024/256) = 16 范围:xx xx 00h -- xx xx FFh (256)

 


STM32单片机为主机,W25Q64为从机

CS:片选

DO:从机输出

CLK:时钟

DI:从机输入

 

void MySPI_Init(void)//初始化

{

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

 

    GPIO_InitTypeDef GPIO_InitStruct;

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7;

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA, &GPIO_InitStruct);

 

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA, &GPIO_InitStruct);

 

    MySPI_W_SS(1);

    MySPI_W_SCK(0);

}

 

 

封装引脚

void MySPI_W_SS(uint8_t BitValue)

{

    GPIO_WriteBit(SPI_Port,SS,(BitAction)BitValue);

}

 

void MySPI_W_SCK(uint8_t BitValue)

{

    GPIO_WriteBit(SPI_Port,SCK,(BitAction)BitValue);

}

 

void MySPI_W_MOSI(uint8_t BitValue)

{

    GPIO_WriteBit(SPI_Port,MOSI,(BitAction)BitValue);

}

 

uint8_t MySPI_R_MISO(void)

{

   return (GPIO_ReadInputDataBit(SPI_Port,MISO));

}

 


void MySPI_Start(void)

{

    MySPI_W_SS(0);

}

 

void MySPI_Stop(void)

{

    MySPI_W_SS(1);

}




 


uint8_t MySPI_SwapByte(uint8_t ByteSend)

{

    uint8_t ByteReceive = 0x00;

 

    for(int8_t i = 7; i >= 0; i--)

    {

        //上升沿前,主机移出数据

        MySPI_W_MOSI(ByteSend & (1 << i));

        MySPI_W_SCK(1);

        //上升沿时,从机会把MOSI数据读走

(第一个边沿移出数据)

        //下降沿前(第二个边沿),主机读入数据

(第二个边沿移入数据)

        if(MySPI_R_MISO() == 1){ByteReceive |= (1 << i);}

        MySPI_W_SCK(0);

    }

    return ByteReceive;

}

 


W25Q64

void W25Q64_Init(void)

{

    MySPI_Init();

}

 

void W25Q64_ReadID(uint8_t *MID, uint16_t *DID)

{

    MySPI_Start();

    MySPI_SwapByte(W25Q64_JEDEC_ID);//发W25Q64读ID号指令

    //从机返回3个ID数据

    *MID = MySPI_SwapByte(W25Q64_DUMMY_BYTE);//用0XFF读出寄存器中的厂商ID

    *DID = MySPI_SwapByte(W25Q64_DUMMY_BYTE);//用0XFF读出寄存器中的设备ID高8位

    *DID = (*DID << 8)|MySPI_SwapByte(W25Q64_DUMMY_BYTE);//用0XFF读出寄存器中的设备ID低8位,拼接

    MySPI_Stop();

}

 

void W25Q64_WriteEnable(void)

{

    MySPI_Start();

    MySPI_SwapByte(W25Q64_WRITE_ENABLE);

    MySPI_Stop();

}

 

void W25Q64_WaitBusy(void)

{

    uint32_t TimeOut = 10000;

 

    MySPI_Start();

    MySPI_SwapByte(W25Q64_READ_STATUS_REGISTER_1);

    while( (MySPI_SwapByte(W25Q64_DUMMY_BYTE) & 0x01) == 0x01)//等待BUSY位为0

    {   //超时检测

        TimeOut--;

        if(TimeOut == 0)

        break;

    }

    MySPI_Stop();

}

 

void W25Q64_PageProgram(uint32_t Address, uint8_t *DataArray, uint16_t Count)

{

    uint16_t i;

 

    W25Q64_WriteEnable();//写使能

 

    MySPI_Start();

    MySPI_SwapByte(W25Q64_PAGE_PROGRAM);

    MySPI_SwapByte(Address >> 16);

    MySPI_SwapByte(Address >> 8);

    MySPI_SwapByte(Address);

    for(i = 0; i < Count; i++)

    {

        MySPI_SwapByte(DataArray[i]);

    }

    MySPI_Stop();

 

    W25Q64_WaitBusy();//等待busy位

}

 


//擦除扇区

void W25Q64_SectorErase(uint32_t Address)

{

    W25Q64_WriteEnable();//写使能

 

    MySPI_Start();

    MySPI_SwapByte(W25Q64_SECTOR_ERASE_4KB);

    MySPI_SwapByte(Address >> 16);

    MySPI_SwapByte(Address >> 8);

    MySPI_SwapByte(Address);

    MySPI_Stop();

 

    W25Q64_WaitBusy();//等待busy位

}


 

//读数据

void W25Q64_ReadData(uint32_t Address, uint8_t *DataArray, uint32_t Count)

{

    uint32_t i;

 

    MySPI_Start();

    MySPI_SwapByte(W25Q64_READ_DATA);

    MySPI_SwapByte(Address >> 16);

    MySPI_SwapByte(Address >> 8);

    MySPI_SwapByte(Address);

 

    for(i = 0; i < Count; i++)

    {

        DataArray[i] = MySPI_SwapByte(W25Q64_DUMMY_BYTE);

    }

 

    MySPI_Stop();

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


江科大学习笔记 _14.软件SPI的评论 (共 条)

分享到微博请遵守国家法律