模块芯片笔记

目录

 

W25Q128

5500网络芯片

CH376U盘读取模块芯片

温度传感器DS18B20


W25Q128

W25Q128 将 16M(16M=16*1024K) 的容量分为 256 个块(Block),每个块大小为 64K 字节,每
个块又分为16 个扇区(Sector),每个扇区 4K 个字节(也就是4*1024=4096个地址)。W25Q128
的最小擦除单位为一个扇区,也就是每次必须擦除 4K 个字节

读取函数:

void W25QXX_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead)
{
u16 i;
W25QXX_CS=0; //使能器件
SPI1_ReadWriteByte(W25X_ReadData); //发送读取命令
SPI1_ReadWriteByte((u8)((ReadAddr)>>16)); //发送24bit地址 ,右移16位,只
剩下高8位,所以首先发送最高8位
SPI1_ReadWriteByte((u8)((ReadAddr)>>8)); //右移8位,强制转换取后8位,再
发送中间8位的数据
SPI1_ReadWriteByte((u8)ReadAddr); //强制转换保留后8位,最后发送低8位的数
据
for(i=0;i<NumByteToRead;i++)//SPI1_ReadWriteByte(0XFF)只是读取一个字节的
数据,利用循环读取指定大小数据
{
pBuffer[i]=SPI1_ReadWriteByte(0XFF); //循环读数
}
W25QXX_CS=1;
}

写入函数:

//写SPI FLASH
//在指定地址开始写入指定长度的数据
//该函数带擦除操作!
//pBuffer:数据存储区
//WriteAddr:开始写入的地址(24bit)
//NumByteToWrite:要写入的字节数(最大65535)
u8 W25QXX_BUFFER[4096];
void W25QXX_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
{
u32 secpos;
u16 secoff;
u16 secremain;
u16 i;
u8 * W25QXX_BUF;
W25QXX_BUF=W25QXX_BUFFER;
secpos=WriteAddr/4096;//扇区地址
secoff=WriteAddr%4096;//在扇区内的偏移
secremain=4096-secoff;//扇区剩余空间大小
//printf("ad:%X,nb:%X\r\n",WriteAddr,NumByteToWrite);//测试用
if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//不大于4096个字
节
while(1)
{
W25QXX_Read(W25QXX_BUF,secpos*4096,4096);//读出整个扇区的内容
for(i=0;i<secremain;i++)//校验数据
{
if(W25QXX_BUF[secoff+i]!=0XFF)break;//需要擦除
}
if(i<secremain)//需要擦除
{
W25QXX_Erase_Sector(secpos);//擦除这个扇区
for(i=0;i<secremain;i++) //复制
{
W25QXX_BUF[i+secoff]=pBuffer[i];
}
W25QXX_Write_NoCheck(W25QXX_BUF,secpos*4096,4096);//写入整个扇
区
}else W25QXX_Write_NoCheck(pBuffer,WriteAddr,secremain);//写已经擦
除了的,直接写入扇区剩余区间.
if(NumByteToWrite==secremain)break;//写入结束了
else//写入未结束
{
secpos++;//扇区地址增1
secoff=0;//偏移位置为0
pBuffer+=secremain; //指针偏移
WriteAddr+=secremain;//写地址偏移
NumByteToWrite-=secremain; //字节数递减
if(NumByteToWrite>4096)secremain=4096; //下一个扇区还是写不完
else secremain=NumByteToWrite; //下一个扇区可以写完了
}
};
}

速度设置:

//SPI1速度设置函数
//SPI速度=fAPB2/分频系数
//@ref SPI_BaudRate_Prescaler:SPI_BaudRatePrescaler_2~SPI_BaudRatePrescal
er_256
//fAPB2时钟一般为84Mhz:
void SPI1_SetSpeed(u8 SPI_BaudRatePrescaler)
{
assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));//判断有效
性
SPI1->CR1&=0XFFC7;//位3-5清零,用来设置波特率
SPI1->CR1|=SPI_BaudRatePrescaler; //设置SPI1速度
SPI_Cmd(SPI1,ENABLE); //使能SPI1
}

向芯片写入数据:

const u8 TEXT_Buffer[]={"Explorer STM32F4 SPI TEST"};
#define SIZE sizeof(TEXT_Buffer)
u8 datatemp[SIZE];
FLASH_SIZE=16*1024*1024; //FLASH 大小为16M字节




W25QXX_Write((u8*)TEXT_Buffer,FLASH_SIZE-100,SIZE); //从倒数第100个字节开始写入SIZE
个字节 
W25QXX_Read(datatemp,FLASH_SIZE-100,SIZE); //从倒数100个字节开始读SIZE个字节到
datatemp中

5500网络芯片

5500基于SPI接口,数据存储地址共64k,也就是0­FFFF,但是手册规定数据缓存区控制在32K之
内,包括数据发送缓存和接收缓存,共有8个Socket,默认使用第0个Socket,缓存区发送和接收每
个Socket都分配为2K。 
5500SPI协议在SCLK上升沿锁存,下降沿输出,SPI配置

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值