你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F0 SPI

[复制链接]
tanic 提问时间:2019-8-7 10:11 /
如图,为啥我SPI的 3个字节写完了 SCK信号不停止呢
  1. SPI_InitTypeDef  SPI_InitStructure;
  2.         GPIO_InitTypeDef GPIO_InitStructure;
  3.        
  4.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
  5.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB  , ENABLE);
  6.        
  7.         GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_0);
  8.   GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_0);
  9.   GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_0);
  10.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
  11.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  12.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  13.   GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
  14.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;;
  15.         GPIO_Init(GPIOB,&GPIO_InitStructure);

  16.        
  17.   SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  18.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  19.   SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  20.   SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  21.   SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  22.   SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  23.   SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;
  24.   SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;
  25.   SPI_InitStructure.SPI_CRCPolynomial = 7;
  26.   SPI_Init(SPI2, &SPI_InitStructure);        
  27.        
  28.         SPI_RxFIFOThresholdConfig(SPI2,SPI_RxFIFOThreshold_QF);
  29.         SPI_Cmd(SPI2, ENABLE);
复制代码

  1. uint8_t spi2_read_write(uint16_t a)
  2. {
  3.         while(RESET==(SPI2->SR & SPI_I2S_FLAG_TXE));
  4.         SPI2->DR = a;
  5.         while(RESET==(SPI2->SR & SPI_I2S_FLAG_RXNE));
  6.         a = SPI2->DR;
  7.         while(RESET==(SPI2->SR & SPI_I2S_FLAG_TXE));
  8.         while(RESET==(SPI2->SR & SPI_I2S_FLAG_RXNE));
  9.        
  10.         SPI_I2S_ClearFlag(SPI2,SPI_I2S_FLAG_OVR);
  11.         return a;
  12. }
复制代码
  1. void LensWriteReg(uint8_t addr,uint16_t data)
  2. {
  3.         uint8_t buf[3];
  4.         buf[0]=addr&0x3f;
  5.         buf[1]=data;
  6.         buf[2]=data>>8;
  7.         CS_1;
  8.         spi2_read_write(buf[0]);
  9.         spi2_read_write(buf[1]);
  10.         spi2_read_write(buf[2]);
  11.         CS_0;
  12. }
复制代码


捕获.PNG
收藏 评论5 发布时间:2019-8-7 10:11

举报

5个回答
tanic 回答时间:2019-8-7 10:14:00
用HAL傻瓜式配置,是没有问题的
捕获.PNG
tanic 回答时间:2019-8-7 10:58:29
*(uint8_t*)&SPI2->DR = (uint8_t)a;
即可

评分

参与人数 1ST金币 +1 收起 理由
linuxdaxia + 1 赞一个!

查看全部评分

butterflyspring 回答时间:2019-8-7 17:22:38
对比一下两种配置后的寄存器内容呗
tanic 回答时间:2019-8-8 09:23:28
butterflyspring 发表于 2019-8-7 17:22
对比一下两种配置后的寄存器内容呗

神奇的操作  
将DR地址转换为 uint8_t* 和 uint16_t* 是两种不同的情况,
在根据初始化配置的8bit(包含以下)用uint8_t*  高于8的用uint16_t*
tanic 回答时间:2019-8-8 09:25:53
(中文版)手册翻遍没找到相关说明,看库试出来的

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版