你是一名程序员,现在要用stm32f103ze给超声波模块GY_US42改IIC地址,并能够在串口调试助手查看模块的IIC地址,要求使用标准库写一份完整的代码,,完整代码包含IIC发送和接收函数,更改地址函数,mian函数,串口相关函数 点击复制后,将打开C知道体验页,且要求给代码写上详细注释
时间: 2023-06-20 09:07:46 浏览: 90
STM32的IIC地址扫描代码
以下是使用stm32f103ze给超声波模块GY_US42改IIC地址的完整代码,包含IIC发送和接收函数,更改地址函数,mian函数,串口相关函数:
```c
#include "stm32f10x.h"
#include "stdio.h"
/* 定义 I2C 相关宏 */
#define I2C_SPEED 100000 // I2C 速度为 100kHz
#define I2C_SLAVE_ADDRESS 0x70 // GY-US42 超声波模块默认地址为 0x70
/* 定义串口相关宏 */
#define USART_BAUDRATE 115200 // 波特率为 115200
#define USARTx USART1 // 使用 USART1
#define USARTx_IRQn USART1_IRQn // 使用 USART1 中断
/* 定义 I2C 和 USART 相关变量 */
I2C_InitTypeDef I2C_InitStructure;
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/* I2C 发送函数 */
void I2C_SendData(uint8_t slaveAddr, uint8_t *data, uint8_t length)
{
/* 使能 I2C 总线 */
I2C_GenerateSTART(I2C1, ENABLE);
/* 等待 I2C 总线空闲 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
/* 发送从机地址,并等待从机响应 */
I2C_Send7bitAddress(I2C1, slaveAddr, I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
/* 循环发送数据 */
while(length--)
{
I2C_SendData(I2C1, *data++);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
}
/* 使能 I2C 停止位 */
I2C_GenerateSTOP(I2C1, ENABLE);
}
/* I2C 接收函数 */
void I2C_ReceiveData(uint8_t slaveAddr, uint8_t *data, uint8_t length)
{
/* 使能 I2C 总线 */
I2C_GenerateSTART(I2C1, ENABLE);
/* 等待 I2C 总线空闲 */
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
/* 发送从机地址,并等待从机响应 */
I2C_Send7bitAddress(I2C1, slaveAddr, I2C_Direction_Receiver);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
/* 循环接收数据 */
while(length--)
{
if(length == 0)
{
I2C_AcknowledgeConfig(I2C1, DISABLE); // 最后一个字节不发送应答信号
}
else
{
I2C_AcknowledgeConfig(I2C1, ENABLE); // 非最后一个字节发送应答信号
}
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
*data++ = I2C_ReceiveData(I2C1);
}
/* 使能 I2C 停止位 */
I2C_GenerateSTOP(I2C1, ENABLE);
}
/* 更改 I2C 地址函数 */
void I2C_ChangeAddress(uint8_t oldAddr, uint8_t newAddr)
{
uint8_t data[2];
/* 发送更改地址命令 */
data[0] = 0xAA;
I2C_SendData(oldAddr, data, 1);
/* 接收应答 */
I2C_ReceiveData(oldAddr, data, 1);
/* 发送新地址 */
data[0] = newAddr << 1;
I2C_SendData(oldAddr, data, 1);
/* 接收应答 */
I2C_ReceiveData(oldAddr, data, 1);
}
/* USART 发送一个字符 */
void USART_SendChar(USART_TypeDef* USARTx, char ch)
{
USART_SendData(USARTx, (uint8_t) ch);
while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
}
/* USART 发送字符串 */
void USART_SendString(USART_TypeDef* USARTx, char* str)
{
while(*str)
{
USART_SendChar(USARTx, *str++);
}
}
/* USART 接收一个字符 */
char USART_ReceiveChar(USART_TypeDef* USARTx)
{
while(USART_GetFlagStatus(USARTx, USART_FLAG_RXNE) == RESET);
return (char) USART_ReceiveData(USARTx);
}
/* USART 中断处理函数 */
void USARTx_IRQHandler(void)
{
if(USART_GetITStatus(USARTx, USART_IT_RXNE) != RESET)
{
char ch = USART_ReceiveChar(USARTx);
USART_SendChar(USARTx, ch); // 将接收到的字符原样发送回去
}
}
int main(void)
{
/* 使能 GPIOA、I2C1 和 USART1 时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
/* 配置 PA9 和 PA10 为复用推挽输出模式 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* 配置 USART1 参数 */
USART_InitStructure.USART_BaudRate = USART_BAUDRATE;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USARTx, &USART_InitStructure);
/* 配置 USART1 中断 */
USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE);
NVIC_EnableIRQ(USARTx_IRQn);
/* 配置 I2C1 参数 */
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = I2C_SPEED;
I2C_Init(I2C1, &I2C_InitStructure);
/* 使能 I2C1 */
I2C_Cmd(I2C1, ENABLE);
/* 更改 I2C 地址 */
I2C_ChangeAddress(I2C_SLAVE_ADDRESS, 0x71);
/* 无限循环,不断接收并发送 USART 数据 */
while(1)
{
char ch = USART_ReceiveChar(USARTx);
USART_SendChar(USARTx, ch);
}
}
```
注:以上代码仅供参考,具体实现需根据实际情况进行调整。
阅读全文