当前位置: 首页 > news >正文

东莞58同城做网站电话注册网站域名多少钱一年

东莞58同城做网站电话,注册网站域名多少钱一年,qq空间是哪个公司开发的,新媒体运营公司排行榜SPI软件模拟的时序 SPI协议中,NSS、SCK、MOSI由主机产生,MISO由从机产生,在SCK每个时钟周期MOSI、MISO传输一位数据,数据的输入输出是同时进行的,所以读写数据也可以视作交换数据。所以读写时对数据位的控制都是用同一…

SPI软件模拟的时序

SPI协议中,NSS、SCK、MOSI由主机产生,MISO由从机产生,在SCK每个时钟周期MOSI、MISO传输一位数据,数据的输入输出是同时进行的,所以读写数据也可以视作交换数据。所以读写时对数据位的控制都是用同一个函数即可。

输出引脚为推挽输出,输入引脚为浮空或上拉输入
在这里插入图片描述
如上图所示:
初始状态下,

  • CS需要拉高
  • CLK模式0的时候拉低,模式3的时候拉高

然后读/写数据状态时

  • CS拉低
  • 如果需要写数据或读数据,先将数据写入DI线
  • 拉高CLK电平
  • 读DO线
  • 拉低CLK电平
  • 然后循环7次前面四步,则交换了一个字节数据

例程

#include "stm32f10x.h"                  // Device header
#include "hal_spi.h"void hal_SPI_W_SS(uint8_t BitValue)		//写设备线
{GPIO_WriteBit(SPI_SS_PORT, SPI_SS_PIN, (BitAction)BitValue);
}void hal_SPI_W_SCK(uint8_t BitValue)	//写时钟线
{GPIO_WriteBit(SPI_SCK_PORT, SPI_SCK_PIN, (BitAction)BitValue);
}void hal_SPI_W_MOSI(uint8_t BitValue)	//写主机发数据线
{GPIO_WriteBit(SPI_MOSI_PORT, SPI_MOSI_PIN, (BitAction)BitValue);
}uint8_t hal_SPI_R_MISO(void)					//读从机发数据线
{return GPIO_ReadInputDataBit(SPI_MISO_PORT, SPI_MISO_PIN);
}/****************************************************************************
*@*名称 : hal_SPI_Init
*@*功能 : 初始化spi的各个引脚
*@*形参 : 无
*@*返回值 : 无
****************************************************************************/
void hal_SPI_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);hal_SPI_W_SS(1);hal_SPI_W_SCK(0);
}/****************************************************************************
*@*名称 : hal_SPI_Start
*@*功能 : spi开始传输数据,设备线拉高
*@*形参 : 无
*@*返回值 : 无
****************************************************************************/
void hal_SPI_Start(void)
{hal_SPI_W_SS(0);
}/****************************************************************************
*@*名称 : hal_SPI_Stop
*@*功能 : spi停止传输数据,设备线拉低
*@*形参 : 无
*@*返回值 : 无
****************************************************************************/
void hal_SPI_Stop(void)
{hal_SPI_W_SS(1);
}/****************************************************************************
*@*名称 : hal_SPI_SwapByte
*@*功能 : spi交换数据,交换一个八位数据
*@*形参 : 无
*@*返回值 : 无
****************************************************************************/
uint8_t hal_SPI_SwapByte(uint8_t ByteSend)		//交换一个八位数据
{uint8_t i, ByteReceive = 0x00;for (i = 0; i < 8; i ++){hal_SPI_W_MOSI(ByteSend & (0x80 >> i));hal_SPI_W_SCK(1);if (hal_SPI_R_MISO() == 1){ByteReceive |= (0x80 >> i);}hal_SPI_W_SCK(0);}return ByteReceive;
}

SPI在读取数据时,为什么我们必须发送虚拟字节Dummy_Bytes才能接收结果?
SPI必须生成时钟脉冲才能将数据移出。对于大多数(如果不是全部)SPI主机,产生时钟脉冲的唯一方式是发送字节。如果你仔细想想,这是有道理的。
总结:Dummy_Bytes无实际意义,只是为了产生时钟脉冲,这样才能读取数据。

W25Q64的通讯格式

FLASH操作注意事项

  • 写入操作前,必须先进行写使能
  • 每个数据位只能由1改写为0,不能由0改写为1
  • 写入数据前必须先擦除,擦除后,所有数据位变为1
  • 擦除必须按最小擦除单元进行(扇区擦除:4096个字节4KB)
  • 连续写入多字节时,最多写入一页数据,超过页尾位置的数据会到页首覆盖(一页256个字节)
  • 写入操作后芯片进入忙碌状态,不响应新的读写操作(看Busy寄存器是否为1)

W25Q64的读写数据帧结构

在这里插入图片描述
如上:起始信号+命令+地址+交换数据+结束

整体代码实现

综合上述两点要求,得以下代码思路

写操作

在每次写操作开始前都进行写使能,结束前进行等待写操作完成
则整个流程为:写使能>>起始信号>>发送写指令>>写入地址>>写入数据>>结束信号>>等待写操作完成

/****************************************************************************
*@*名称 : hal_W25Q64_WriteEnable
*@*功能 : spi写使能打开
*@*形参 : 无
*@*返回值 : 无
****************************************************************************/
void hal_W25Q64_WriteEnable(void)										//spi写使能打开
{hal_SPI_Start();	hal_SPI_SwapByte(W25Q64_WRITE_ENABLE);					//0x06指令码写使能打开hal_SPI_Stop();
}/****************************************************************************
*@*名称 : hal_W25Q64_WaitBusy
*@*功能 : 忙碌位寄存器,如果写寄存器在工作就等待,没有就很快退出
*@*形参 : 无
*@*返回值 : 无
****************************************************************************/
void hal_W25Q64_WaitBusy(void)											//忙碌位寄存器,如果写寄存器在工作就等待,没有就很快退出
{uint32_t Timeout;hal_SPI_Start();hal_SPI_SwapByte(W25Q64_READ_STATUS_REGISTER_1);	//W25Q64_READ_STATUS_REGISTER_1忙碌标志位地址Timeout = 100000;while ((hal_SPI_SwapByte(W25Q64_DUMMY_BYTE) & 0x01) == 0x01)	//忙为1,不忙为0{Timeout --;if (Timeout == 0){break;}}hal_SPI_Stop();
}/****************************************************************************
*@*名称 : hal_W25Q64_PageProgram
*@*功能 : 页写入
*@*形参 : Address:写入的地址	DataArray:写入数据存放地址		Count:写入字节数
*@*返回值 : 无
****************************************************************************/
void hal_W25Q64_PageProgram(uint32_t Address, uint8_t *DataArray, uint16_t Count)		//页写入
{uint16_t i;hal_W25Q64_WriteEnable();hal_SPI_Start();hal_SPI_SwapByte(W25Q64_PAGE_PROGRAM);		//连续写指令hal_SPI_SwapByte(Address >> 16);					//二十四位地址高八位hal_SPI_SwapByte(Address >> 8);						//地址中间八位hal_SPI_SwapByte(Address);								//地址低八位for (i = 0; i < Count; i ++){hal_SPI_SwapByte(DataArray[i]);					//连续写入数据}hal_SPI_Stop();hal_W25Q64_WaitBusy();											//等待写入成功
}

不过调用写函数时记得先擦除原先的数据

擦除操作

操作步骤:写使能>>起始信号>>擦除命令>>擦除地址>>结束信号>>等待写完成

/****************************************************************************
*@*名称 : hal_W25Q64_SectorErase
*@*功能 : 扇区擦除操作
*@*形参 : Address:擦除扇区的地址
*@*返回值 : 无
****************************************************************************/
void hal_W25Q64_SectorErase(uint32_t Address)			//扇区擦除操作
{hal_W25Q64_WriteEnable();												//写使能hal_SPI_Start();															hal_SPI_SwapByte(W25Q64_SECTOR_ERASE_4KB);		//扇区擦除指令码hal_SPI_SwapByte(Address >> 16);							//擦除的地址高8位hal_SPI_SwapByte(Address >> 8);								//擦除的地址中间8位hal_SPI_SwapByte(Address);hal_SPI_Stop();hal_W25Q64_WaitBusy();
}

读操作

读操作要注意开头说的她必须交换数据,既读取同时要发送一个无用数据
操作步骤:起始信号>>读指令>>读地址>>读数据(并写入0xff)>>结束信号


/****************************************************************************
*@*名称 : hal_W25Q64_ReadData
*@*功能 : 连续读数据
*@*形参 : Address:读的首地址	DataArray:读出数据存放地址		Count:读的字节数
*@*返回值 : 无
****************************************************************************/
void hal_W25Q64_ReadData(uint32_t Address, uint8_t *DataArray, uint32_t Count)		//连续读数据
{uint32_t i;hal_SPI_Start();													hal_SPI_SwapByte(W25Q64_READ_DATA);																						//读指令hal_SPI_SwapByte(Address >> 16);																							//读开始地址hal_SPI_SwapByte(Address >> 8);																								hal_SPI_SwapByte(Address);for (i = 0; i < Count; i ++){DataArray[i] = hal_SPI_SwapByte(W25Q64_DUMMY_BYTE);													//连续读}hal_SPI_Stop();
}
http://www.yayakq.cn/news/212544/

相关文章:

  • 西安网站推广公司电话银川森林半岛
  • 佛山微网站建设天博徐州设计公司有哪些
  • 视频网站点击链接怎么做的上海人才网最新招聘信息
  • 手机网站的优势郑州网站关键词优化公司哪家好
  • 南宁网站建设培训学校ps怎么设计网页
  • 网站营销建设专业3合1网站建设价格
  • 深圳做网站乐云seo598在线传媒有限公司
  • 贵州省住房和城乡建设厅官网站首页万网一个ip建立多个网站
  • 阿里云虚拟主机多个网站集团网页建设
  • 南京做企业号微网站营销宿州注册公司多少钱
  • 房地产网站怎么推广微信24小时人工申诉
  • 龙岗网络营销网站制作哪里好各大网站网址是多少
  • 中国建设银行网站太慢了北京制作网站报价
  • 南昌网站建设利润免费全自动网页制作系统
  • 建设装修网站交互式网站开发
  • 国外经典手机网站设计app开发费用明细
  • 深南花园裙楼 网站建设手机网站的建设价格
  • 商城网站设计企业数字资产币币交易所网站开发
  • 电脑网站视频怎么下载营销型网站手机端
  • 重庆网站设计定制东莞市品牌网站建设价格
  • app官网入口整站关键词排名优化
  • 网站建设中怎么编辑图片网站营销方式
  • 自己动手创建一个公司网站个人简历封面
  • 网站界面分类网站建设一条龙
  • 网站开发seo要求用户体验设计方法
  • 网站开发从零到上线贵州软件制作
  • 重庆网站建设公司哪个最好注册网站平台
  • 深圳网站建设服务平台重庆綦江网站制作公司电话
  • 网站做seo创业 做网站
  • 互动网站开发百度快照不更新