本帖最后由 zcc_super 于 2017-2-17 19:42 编辑
问题1:
在操作 W25Q128 中写页实验,这个页的概念到底是什么, 下面的注视中写到,SPI在一页(0~65535),这个0~65535是一页,那不是意味着一页就是一个block吗?
然后在一页中写入少于256个字节,我看了芯片的数据手册的数序图,是只能写入了256个字节?如果是sector的话不是也应该有4096个字节的吗,为什么只能写个256个字节?(我记得好像视频里说 页就是sector的样子)
总而言之,对于这个页的概念真的不是很清楚,请搞懂的大神们解释一下。(个人理解是只能从一次性一个地址到一个地址写入256个字节,之后就要从下个地址重新再来写256个字节,但是这样的话地址怎么划分呢?一个sector有16页吗?)
//SPI在一页(0~65535)内写入少于256个字节的数据
//在指定地址开始写入最大256字节的数据
//pBuffer:数据存储区
//WriteAddr:开始写入的地址(24bit)
//NumByteToWrite:要写入的字节数(最大256),该数不应该超过该页的剩余字节数!!!
void W25QXX_Write_Page(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
{
}
问题2:
sector的地址到底是怎么确定的,是每一个sector都有编号吗,总共4096个sector,然后1就是第一个sector,是这样吗?
然后 写入芯片的地址时序图里面显示的是24bit,扇区的标号*4096 就是相应的24bit地址了吗?不是很理解。
再然后,我觉得block这个概念没什么用处是吗?当某个block的sector写满后自动跳转到下一个block的sector里,不需要什么特殊的处理,就是和正常的跨sector是一样的吧。 还望指正。
问题3: 还有一个问题,也就不开帖了,先发上来,看有人回没
//RS485查询接收到的数据
//buf:接收缓存首地址
//len:读到的数据长度
void RS485_Receive_Data(u8 *buf,u8 *len)
{
u8 rxlen=RS485_RX_CNT;
u8 i=0;
*len=0; //默认为0
delay_ms(10); //等待10ms,连续超过10ms没有接收到一个数据,则认为接收结束
if(rxlen==RS485_RX_CNT&&rxlen)//接收到了数据,且接收完成了
{
for(i=0;i<rxlen;i++)
{
buf=RS485_RX_BUF;
}
*len=RS485_RX_CNT; //记录本次数据长度
RS485_RX_CNT=0; //清零
}
}
针对这个函数 这一句 delay_ms(10); //等待10ms,连续超过10ms没有接收到一个数据,则认为接收结束
这个放到开头是不是会好一点,否则就算在这个时候进入了中断服务函数里,那接受完成后 后面的if条件不就不成立了吗,很奇怪,为什么这里会有一个延时,对于这个if判断条件也不是很懂。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
第三个问题,如果delay的时候进入了中断函数,说明数据正在接收,if条件当然就不成立。if判断条件就是保证485接收数据完整。
如果不完整,要等中断接收完整之后再进if执行操作。相信RS485_Receive_Data()这个函数也是放在一个while()循环内的。
这个函数是一直在while(1)的,不停的扫描,if是保证了数据的完整,可是不加这个delay这个数据就不完整了吗。
中断函数里的处理是接受了一个数据,并且将RS485_RX_CNT标志位加一。
所以还是觉得这个delay有点莫名其妙的感觉。
在这里加延时应该就是想让延时的这段时间把数据接收完,然后判断一次就OK了,否则如果接收不完全,程序就又会到while()跑一圈
那第二个问题呢,能回答一下吗?
我的理解是写入地址,这个地址可以是 0~128/8*1024*1024中的任意一个数, 然后对该数/4096就确定了相应的扇区,总共是有4096个扇区,然后在W25QXX_Erase_Sector函数中,将传入的参数*4096就确定相应的扇区起始地址,这个4096个扇区是人为定义的,而在程序中只是识别相应的24位地址。所以block没啥意义,只是人为定义的,是这样吗?请指教。
一周热门 更多>