1、STM32通过软件IIC连接ADXL345(ADXL345使用遇到的一些坑) |
您所在的位置:网站首页 › i2c单片机模块程序 › 1、STM32通过软件IIC连接ADXL345(ADXL345使用遇到的一些坑) |
文章目录
前言一、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 |