stm32f103c8t6与cjc8988音频芯片iic通信的例程
时间: 2023-08-23 21:06:40 浏览: 143
以下是使用STM32F103C8T6与CJMCU-8988音频芯片进行I2C通信的例程:
```c
#include "stm32f10x.h"
#define I2C_Speed 100000 //I2C速度
#define I2C1_SLAVE_ADDRESS7 0x3C //从设备地址
void I2C_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void I2C_Config(void)
{
I2C_InitTypeDef I2C_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
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);
I2C_Cmd(I2C1, ENABLE);
}
void I2C_WriteByte(uint8_t addr, uint8_t reg, uint8_t data)
{
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); //等待总线空闲
I2C_GenerateSTART(I2C1, ENABLE); //发起起始信号
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); //等待起始信号发送完成
I2C_Send7bitAddress(I2C1, addr, I2C_Direction_Transmitter); //发送从设备地址和写信号
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); //等待从设备响应
I2C_SendData(I2C1, reg); //发送寄存器地址
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待数据发送完成
I2C_SendData(I2C1, data); //发送数据
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待数据发送完成
I2C_GenerateSTOP(I2C1, ENABLE); //发起停止信号
}
uint8_t I2C_ReadByte(uint8_t addr, uint8_t reg)
{
uint8_t data = 0;
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); //等待总线空闲
I2C_GenerateSTART(I2C1, ENABLE); //发起起始信号
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); //等待起始信号发送完成
I2C_Send7bitAddress(I2C1, addr, I2C_Direction_Transmitter); //发送从设备地址和写信号
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); //等待从设备响应
I2C_SendData(I2C1, reg); //发送寄存器地址
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待数据发送完成
I2C_GenerateSTART(I2C1, ENABLE); //发起起始信号
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); //等待起始信号发送完成
I2C_Send7bitAddress(I2C1, addr, I2C_Direction_Receiver); //发送从设备地址和读信号
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); //等待从设备响应
I2C_AcknowledgeConfig(I2C1, DISABLE); //关闭应答
I2C_GenerateSTOP(I2C1, ENABLE); //发起停止信号
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_RXNE) == RESET); //等待接收数据
data = I2C_ReceiveData(I2C1); //读取数据
I2C_AcknowledgeConfig(I2C1, ENABLE); //开启应答
return data;
}
int main(void)
{
uint8_t data = 0;
I2C_GPIO_Config();
I2C_Config();
data = I2C_ReadByte(I2C1_SLAVE_ADDRESS7, 0x00); //读取0x00寄存器的值
I2C_WriteByte(I2C1_SLAVE_ADDRESS7, 0x01, 0x12); //写入0x01寄存器的值
while(1);
}
```
在上面的示例中,使用的是STM32F103C8T6的I2C1,SCL使用PB6,SDA使用PB7。通过调用`I2C_GPIO_Config`和`I2C_Config`函数进行GPIO和I2C的初始化配置。
`I2C_WriteByte`函数用于向CJMCU-8988音频芯片写入数据,其中`addr`为从设备地址,`reg`为寄存器地址,`data`为要写入的数据。
`I2C_ReadByte`函数用于从CJMCU-8988音频芯片读取数据,其中`addr`为从设备地址,`reg`为寄存器地址。
在主函数中,可以通过调用`I2C_ReadByte`和`I2C_WriteByte`函数来进行I2C通信。
阅读全文