我的STM32F4 Discovery上边有一个加速度传感器LIS302DL。在演示工程中,ST的工程师使用这个传感器做了个很令人羡慕的东西:解算开发板的姿态。当开发板倾斜时候,处于最上边的LED点亮,其他LED不亮。同时,用MicroUSB数据线将开发板连接电脑时,开发板就会虚拟成一个鼠标。倾斜开发板时,鼠标指针会向倾斜的方向移动。归根结底,就是牛B的ST工程师用加速度传感器完成了姿态解算。

在开发板上,加速度传感器使用了SPI方式用STM32F4芯片进行通信。STM32F4的SPI1 作为主机,与LIS302Dl进行通信,读取或者写入数据。由于我没有使用过STM32的SPI口,因此在板子的空余资源中找到了SPI2接口来做实验。实验是这样的:将SPI的MISO和MOSI脚相连。这样SPI发送了什么数据,就能接收到什么数据。不需要额外的器件就能试验。

引脚:将PB13、PB14、PB15三个引脚的复用功能,分别对应于SPI2SCK、SPI2MISO、SPI2MOSI。

引脚初始化:

void SPI_GPIOConfig(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);  //开启时钟
   
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;  //引脚初始化
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
   
    GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_SPI2);  //打开引脚的复用功能
    GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_SPI2);
    GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_SPI2);
}

SPI2功能初始化:

void SPI_Config(void)
{
    SPI_GPIOConfig();
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);  //时钟
   
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //全双工模式
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;   //作为主机使用
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;   //数据长度8
    SPI_InitStructure.SPI_CPOL  = SPI_CPOL_High;
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;   //软件设置NSS功能
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_InitStructure.SPI_CRCPolynomial = 7;
    SPI_Init(SPI2,&SPI_InitStructure);
    SPI_Cmd(SPI2,ENABLE);
}

之后就可以收发数据了:

void MySPI_SendData(char da)
{
    while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE)==RESET);
    SPI_SendData(SPI2,da);
}

uint8_t MySPI_ReceiveData(void)
{
    while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE)==RESET);
    return SPI_ReceiveData(SPI2);
}

最新文章

  1. 常用shell命令中你所不熟悉的参数
  2. js 优化
  3. 入门:HTML表单与Java 后台交互(复选框提交)
  4. Js C# 实现跨域访问数据
  5. 状态机学习(二)解析INI文件
  6. HDU 4311 前缀和
  7. Spring中Quartz调度器的使用
  8. POJ 3253 Fence Repair(优先队列,哈夫曼树,模拟)
  9. Avoid The Lakes--poj3620
  10. jmeter IP欺骗功能
  11. js实现页面遮罩层,并且阻止页面body滚动
  12. Jquery常用方法合集,超实用
  13. Android访问网络,使用HttpURLConnection还是HttpClient?
  14. java 里的内部类
  15. Spring Cloud 之 Eureka
  16. js 屏蔽浏览器事件汇总
  17. [SinGuLaRiTy] KM算法
  18. BugKu-妹子的陌陌
  19. BZOJ 1806: [Ioi2007]Miners 矿工配餐
  20. JS错题整改

热门文章

  1. 二分图最大权最小权完美匹配模板KM
  2. SAP Adapter启动报错
  3. 块级元素 Vs 内联元素
  4. 图表控件的学习===》hightChart 和 Chartjs的使用
  5. mysq常见问题
  6. css2----实现三角形和带角框
  7. java SE 常用的排序算法
  8. iOS运行时与method swizzling
  9. VS2010 刷新工具箱(刷新自定义控件)
  10. 标准库中的-stack