1、STM32通过软件IIC连接ADXL345(ADXL345使用遇到的一些坑)

您所在的位置:网站首页 i2c单片机模块程序 1、STM32通过软件IIC连接ADXL345(ADXL345使用遇到的一些坑)

1、STM32通过软件IIC连接ADXL345(ADXL345使用遇到的一些坑)

2024-07-10 11:53| 来源: 网络整理| 查看: 265

文章目录 前言一、STM32cubeMx创建工程二、在KEIL中对IIC的配置 1.在你新建的工程中导入IIC驱动文件2.增加一些需要的函数三、开始ADXL345传感器 1.要学会看数据手册2.我的示例总结

        废话不多说,我们直接开始

一、STM32cubeMx创建工程

        (1) 、相信大家在初学stm32的时候基本都是使用st公司的标准库来学习的吧,但是如果你要学习更加深入的话个人建议你还是学习下hal库或者LL库,ST公司推出的hal库来替代原有的标准库,HAL库开始慢慢的被广大STM32开发者所接受,现在已经在实际的项目开发中大量使用,HAL库使得项目的移植变得很简介易懂,但是里面的坑也有些有....

        (2)、 下面是我配置的STM32cubeMX

图1

         我们打开cubeMX之后,点击新建工程之后,选择好自己用到的芯片型号,然后点击右上角那个start project 就会进入我上面图1的界面,然后根据提示依次配置好自己需要的功能,这里我用的是c8t6,我配置PB6和PB7分别作为我的驱动IIC的SCL和SDA,关于软件IIC这里就不多说什么了。

                                                                         图2 

        时钟树我是将HCLK直接配置为72Mhz,你可以根据你所需要的功能去配置,说实话用起来挺方便的,啊哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈,但是要注意的一点的c8t6这里我是在图1中RCC中的HSE配置成ceramic Resonator,如果你不配置RCC中HSE的话,它默认是使用内部高速时钟RC,这样的话你无法将HCLK配置成72Mhz。

        至于对project manager的设置的话相信大家看懂是没有问题的。

二、在KEIL中对IIC的配置 1.在你新建的工程中导入IIC驱动文件

(1)、iic.c文件

代码如下(示例):

#include "iic.h" /******************************************************************************* * 函 数 名         : IIC_Init * 函数功能           : IIC初始化 * 输    入         : 无 * 输    出         : 无 *******************************************************************************/ void IIC_Init(void) {   GPIO_InitTypeDef GPIO_InitStruct = {0};   /* GPIO Ports Clock Enable */   __HAL_RCC_GPIOD_CLK_ENABLE();   __HAL_RCC_GPIOA_CLK_ENABLE();   __HAL_RCC_GPIOB_CLK_ENABLE();   /*Configure GPIO pin Output Level */   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_RESET);   /*Configure GPIO pins : PB6 PB7 */   GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;   GPIO_InitStruct.Pull = GPIO_NOPULL;   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);     IIC_SCL=1;     IIC_SDA=1;     } /******************************************************************************* * 函 数 名         : SDA_OUT * 函数功能           : SDA输出配置        * 输    入         : 无 * 输    出         : 无 *******************************************************************************/ void SDA_OUT(void) {   GPIO_InitTypeDef GPIO_InitStruct = {0};        /*Configure GPIO pins : PB6 PB7 */   GPIO_InitStruct.Pin = GPIO_PIN_7;   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;   GPIO_InitStruct.Pull = GPIO_NOPULL;   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } /******************************************************************************* * 函 数 名         : SDA_IN * 函数功能           : SDA输入配置        * 输    入         : 无 * 输    出         : 无 *******************************************************************************/ void SDA_IN(void) {   GPIO_InitTypeDef GPIO_InitStruct = {0};        /*Configure GPIO pins : PB7 */   GPIO_InitStruct.Pin = GPIO_PIN_7;   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;   GPIO_InitStruct.Pull = GPIO_PULLUP;     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } /******************************************************************************* * 函 数 名         : IIC_Start * 函数功能           : 产生IIC起始信号    * 输    入         : 无 * 输    出         : 无 *******************************************************************************/ void IIC_Start(void) {     SDA_OUT();     //sda线输出     IIC_SDA=1;                 IIC_SCL=1;     Delay_us(5);      IIC_SDA=0;//START:when CLK is high,DATA change form high to low      Delay_us(6);     IIC_SCL=0;//钳住I2C总线,准备发送或接收数据  }     /******************************************************************************* * 函 数 名         : IIC_Stop * 函数功能           : 产生IIC停止信号    * 输    入         : 无 * 输    出         : 无 *******************************************************************************/ void IIC_Stop(void) {     SDA_OUT();//sda线输出     IIC_SCL=0;     IIC_SDA=0;//STOP:when CLK is high DATA change form low to high      IIC_SCL=1;      Delay_us(6);     IIC_SDA=1;//发送I2C总线结束信号     Delay_us(6);                                    } /******************************************************************************* * 函 数 名         : IIC_Wait_Ack * 函数功能           : 等待应答信号到来    * 输    入         : 无 * 输    出         : 1,接收应答失败                      0,接收应答成功 *******************************************************************************/ uint8_t IIC_Wait_Ack(void) {     uint8_t tempTime=0;     SDA_IN();      //SDA设置为输入       IIC_SDA=1;     Delay_us(1);            IIC_SCL=1;     Delay_us(1);          while(READ_SDA)     {         tempTime++;         if(tempTime>250)         {             IIC_Stop();             return 1;         }     }     IIC_SCL=0;//时钟输出0             return 0;   }  /******************************************************************************* * 函 数 名         : IIC_Ack * 函数功能           : 产生ACK应答   * 输    入         : 无 * 输    出         : 无 *******************************************************************************/ void IIC_Ack(void) {     IIC_SCL=0;     SDA_OUT();     IIC_SDA=0;     Delay_us(2);     IIC_SCL=1;     Delay_us(5);     IIC_SCL=0; } /******************************************************************************* * 函 数 名         : IIC_NAck * 函数功能           : 产生NACK非应答   * 输    入         : 无 * 输    出         : 无 *******************************************************************************/             void IIC_NAck(void) {     IIC_SCL=0;     SDA_OUT();     IIC_SDA=1;     Delay_us(2);     IIC_SCL=1;     Delay_us(5);     IIC_SCL=0; }     /******************************************************************************* * 函 数 名         : IIC_Send_Byte * 函数功能           : IIC发送一个字节  * 输    入         : txd:发送一个字节 * 输    出         : 无 *******************************************************************************/           void IIC_Send_Byte(uint8_t txd) {                             uint8_t t;        SDA_OUT();              IIC_SCL=0;//拉低时钟开始数据传输     for(t=0;t0) //0x80  1000 0000             IIC_SDA=1;         else             IIC_SDA=0;         txd


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3