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

网站内容怎么编辑汕头珠宝网站建设

网站内容怎么编辑,汕头珠宝网站建设,百度搜不到WordPress文章,给菠菜网站做外包一、SPI外设简介 STM32内部集成了硬件SPI收发电路#xff0c;可以由硬件自动执行时钟生成、数据收发等功能#xff0c;减轻CPU的负担【硬件电路自动生成时序】 可配置8位/16位数据帧、高位先行/低位先行 时钟频率#xff1a; fPCLK / (2, 4, 8, 16, 32, 64, 128, 256)【SP…一、SPI外设简介 STM32内部集成了硬件SPI收发电路可以由硬件自动执行时钟生成、数据收发等功能减轻CPU的负担【硬件电路自动生成时序】 可配置8位/16位数据帧、高位先行/低位先行 时钟频率 fPCLK / (2, 4, 8, 16, 32, 64, 128, 256)【SPI1是APB2的外设PCLK72MHzSPI2是APB1的外设PCLK36MHz】 支持多主机模型、主或从操作 可精简为半双工/单工通信【使用SPI就是为了发挥全双工的优势】 支持DMA 兼容I2S协议【音频协议将数字信号转化为模拟信号】 STM32F103C8T6 硬件SPI资源SPI1、SPI2 二、SPI框图 LSBFIRST设置低位先行还是高位先行stm32的SPI外设也可以设置为从机模式此时MOSI和MISO的线路就会交叉如图所示接收缓冲器TDR和发送缓冲区RDR占用同一个地址DR移位寄存器和数据寄存器配合可以实现数据连续传输要判断状态寄存器的TXE和RXNESPI在发送的同时也接收数据这点和半双工不一样所以会有两个缓冲区移位寄存器可以共用【在外设电路设计上USART是全双工异步外设所以移位寄存器和数据寄存器都不是共用的I2C是半双工同步外设所以移位寄存器和数据寄存器是共用的】发送缓冲区为空时TXE置1接收缓冲区非空时RXNE置1 三、SPI基本结构 SS引脚采用普通的GPIO口模拟即可 四、主模式全双工连续传输 当数据从发送缓冲区移动到移位寄存器时就会产生时序当三个数据都发送完毕时BSY标志才清空数据从接收缓冲区读出后要软件置RXNE标志位为0 连续传输的硬件设计比较复杂需要软件配合 五、非连续传输【常用】 相比于连续传输TXE为1发送缓冲区为空的时候不急着把数据写入TDR而是等到一个字节时序结束才将数据放到TDR第一个字节时序结束也表示了接收完成此时RXNE标志位为1将数据读出 交换一个字节的四步编程 等待TXE为1写入发送的数据到TDR等待RXNE为1读出RDR接收到的数据 缺点传输频率越高字节与字节之间的时间间隙会越大如图所示 六、软件/硬件波形对比 边沿和电平期间都可以作为数据变化的时刻 软件波形一般在电平期间硬件的波形一般会紧贴边沿 七、硬件I2C读写MPU6050 电路设计 关键代码 MySPI.c #include stm32f10x.h // Device header//ss引脚采用软件模拟即可 void MySPI_W_SS(uint8_t BitValue) {GPIO_WriteBit(GPIOA, GPIO_Pin_4, (BitAction)BitValue); }void MySPI_Init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;//通用推挽输出GPIO_InitStructure.GPIO_Pin GPIO_Pin_4;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA, GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP;//由外设控制设置为复用推挽输出GPIO_InitStructure.GPIO_Pin 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);//完成SPI外设的配置配置SPI_InitStructure结构体SPI_InitTypeDef SPI_InitStructure;SPI_InitStructure.SPI_Mode SPI_Mode_Master;//主机SPI_InitStructure.SPI_Direction SPI_Direction_2Lines_FullDuplex;//双线全双工SPI_InitStructure.SPI_DataSize SPI_DataSize_8b;//8位数据帧SPI_InitStructure.SPI_FirstBit SPI_FirstBit_MSB;//高位先行SPI_InitStructure.SPI_BaudRatePrescaler SPI_BaudRatePrescaler_128;//128分频SPI_InitStructure.SPI_CPOL SPI_CPOL_Low;//模式0SPI_InitStructure.SPI_CPHA SPI_CPHA_1Edge;//模式0SPI_InitStructure.SPI_NSS SPI_NSS_Soft;SPI_InitStructure.SPI_CRCPolynomial 7;//CRC校验SPI_Init(SPI1, SPI_InitStructure);SPI_Cmd(SPI1, ENABLE);//使能外设MySPI_W_SS(1); }void MySPI_Start(void) {MySPI_W_SS(0); }void MySPI_Stop(void) {MySPI_W_SS(1); }//基于spi外设交换一个字节的四个步骤 /* - 等待TXE为1 - 写入发送的数据到TDR - 等待RXNE为1 - 读出RDR接收到的数据 */ uint8_t MySPI_SwapByte(uint8_t ByteSend) {while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) ! SET);SPI_I2S_SendData(SPI1, ByteSend);//自动生成时序波形写入操作会自动将TXE清除while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) ! SET);return SPI_I2S_ReceiveData(SPI1);//读取操作会自动将RXNE清除 } MySPI.h #ifndef __MYSPI_H #define __MYSPI_Hvoid MySPI_Init(void); void MySPI_Start(void); void MySPI_Stop(void); uint8_t MySPI_SwapByte(uint8_t ByteSend);#endif W25Q64.c #include stm32f10x.h // Device header #include MySPI.h #include W25Q64_Ins.hvoid W25Q64_Init(void) {MySPI_Init();//底层spi时序初始化 }//根据指令集写功能函数void W25Q64_ReadID(uint8_t *MID, uint16_t *DID) {MySPI_Start();MySPI_SwapByte(W25Q64_JEDEC_ID);//不同时序调用得到的返回值是不同的*MID MySPI_SwapByte(W25Q64_DUMMY_BYTE);*DID MySPI_SwapByte(W25Q64_DUMMY_BYTE);*DID 8;*DID | MySPI_SwapByte(W25Q64_DUMMY_BYTE);MySPI_Stop(); } //写使能 void W25Q64_WriteEnable(void) {MySPI_Start();MySPI_SwapByte(W25Q64_WRITE_ENABLE);MySPI_Stop(); } //直接读取寄存器的busy位如果为0则表示不忙程序返回否则会阻塞 void W25Q64_WaitBusy(void) {uint32_t Timeout;MySPI_Start();MySPI_SwapByte(W25Q64_READ_STATUS_REGISTER_1);Timeout 100000;while ((MySPI_SwapByte(W25Q64_DUMMY_BYTE) 0x01) 0x01){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);//Count不能定义为uint8_t 因为最大是255字节而不是256字节for (i 0; i Count; i ){MySPI_SwapByte(DataArray[i]);}MySPI_Stop();W25Q64_WaitBusy(); } //扇区擦除 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(); } //按页读取 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(); } W25Q64.h #ifndef __W25Q64_H #define __W25Q64_Hvoid W25Q64_Init(void); void W25Q64_ReadID(uint8_t *MID, uint16_t *DID); void W25Q64_PageProgram(uint32_t Address, uint8_t *DataArray, uint16_t Count); void W25Q64_SectorErase(uint32_t Address); void W25Q64_ReadData(uint32_t Address, uint8_t *DataArray, uint32_t Count);#endif W25Q64_Ins.h #ifndef __W25Q64_INS_H #define __W25Q64_INS_H#define W25Q64_WRITE_ENABLE 0x06 #define W25Q64_WRITE_DISABLE 0x04 #define W25Q64_READ_STATUS_REGISTER_1 0x05 #define W25Q64_READ_STATUS_REGISTER_2 0x35 #define W25Q64_WRITE_STATUS_REGISTER 0x01 #define W25Q64_PAGE_PROGRAM 0x02 #define W25Q64_QUAD_PAGE_PROGRAM 0x32 #define W25Q64_BLOCK_ERASE_64KB 0xD8 #define W25Q64_BLOCK_ERASE_32KB 0x52 #define W25Q64_SECTOR_ERASE_4KB 0x20 #define W25Q64_CHIP_ERASE 0xC7 #define W25Q64_ERASE_SUSPEND 0x75 #define W25Q64_ERASE_RESUME 0x7A #define W25Q64_POWER_DOWN 0xB9 #define W25Q64_HIGH_PERFORMANCE_MODE 0xA3 #define W25Q64_CONTINUOUS_READ_MODE_RESET 0xFF #define W25Q64_RELEASE_POWER_DOWN_HPM_DEVICE_ID 0xAB #define W25Q64_MANUFACTURER_DEVICE_ID 0x90 #define W25Q64_READ_UNIQUE_ID 0x4B #define W25Q64_JEDEC_ID 0x9F #define W25Q64_READ_DATA 0x03 #define W25Q64_FAST_READ 0x0B #define W25Q64_FAST_READ_DUAL_OUTPUT 0x3B #define W25Q64_FAST_READ_DUAL_IO 0xBB #define W25Q64_FAST_READ_QUAD_OUTPUT 0x6B #define W25Q64_FAST_READ_QUAD_IO 0xEB #define W25Q64_OCTAL_WORD_READ_QUAD_IO 0xE3#define W25Q64_DUMMY_BYTE 0xFF#endif main.c #include stm32f10x.h // Device header #include Delay.h #include OLED.h #include W25Q64.huint8_t MID; uint16_t DID;uint8_t ArrayWrite[] {0x01, 0x02, 0x03, 0x04}; uint8_t ArrayRead[4];int main(void) {OLED_Init();W25Q64_Init();OLED_ShowString(1, 1, MID: DID:);OLED_ShowString(2, 1, W:);OLED_ShowString(3, 1, R:);W25Q64_ReadID(MID, DID);OLED_ShowHexNum(1, 5, MID, 2);OLED_ShowHexNum(1, 12, DID, 4);W25Q64_SectorErase(0x000000);W25Q64_PageProgram(0x000000, ArrayWrite, 4);W25Q64_ReadData(0x000000, ArrayRead, 4);OLED_ShowHexNum(2, 3, ArrayWrite[0], 2);OLED_ShowHexNum(2, 6, ArrayWrite[1], 2);OLED_ShowHexNum(2, 9, ArrayWrite[2], 2);OLED_ShowHexNum(2, 12, ArrayWrite[3], 2);OLED_ShowHexNum(3, 3, ArrayRead[0], 2);OLED_ShowHexNum(3, 6, ArrayRead[1], 2);OLED_ShowHexNum(3, 9, ArrayRead[2], 2);OLED_ShowHexNum(3, 12, ArrayRead[3], 2);while (1){} } 参考视频江科大自化协
http://www.sadfv.cn/news/169918/

相关文章:

  • 广告推广平台网站wordpress做知识管理系统
  • 帮人做网站 怎么收费xampp 搭建 wordpress
  • 网站建设流程怎么样文案写作网站
  • 企业网站建设训重庆航运建设发展有限公司 网站
  • 网站建设完整版企业管理系统的功能
  • app在线开发网站建设抖音小程序推广码怎么获得
  • 国内设计师交流网站上海松江水处理网站建设
  • 西安品牌网站建设服务商建设网站基础知识
  • 织梦 网站源码重庆网站建设重庆
  • 模板网站和定制网站影响排名html个人网站完整代码
  • 百度为什么会k网站线上推广话术
  • 加强单位门户网站建设的通知docker wordpress 修改端口
  • 网站开发怎么销售百度关键词指数
  • 男女做暧昧视频网站成都中职学校网站建设推广
  • idea做百度网站谷歌浏览器下载手机版官网中文
  • 做招聘网站的背景图片php源码
  • 教你做吃的网站外贸推广公司
  • 服务器网站目录会网站建设好吗
  • 为什么做的网站要续费河南省建设信息网查询
  • 建网站的小软件网站开发与设计实训心得一千字
  • 深圳建设高端网站商事主体信息查询平台
  • 建站公司最喜欢的网站图文广告制作软件
  • hp网站wordpress去除谷歌字体
  • 平台建设网站公司胡芦娃app软件下载网站
  • 东莞建筑建设网站建设网页类界面图片
  • 织梦网站广告代码教程网络挣钱
  • 安徽休宁建设厅网站二手车的网站建设例子
  • 企业内部信息网站如何建设网架公司名字推荐大全
  • 湖南平台网站建设企业杭州上城区抖音seo有多好
  • 甘肃省环保建设申报网站做公司标志用哪个网站