一、直接上代码:
xBSP_I2C_Simu.h
#ifndef __xBSP_I2C_SIMU_H
#define __xBSP_I2C_SIMU_H
/**************************************************START OF FILE*****************************************************/
/*------------------------------------------------------------------------------------------------------------------
包含头文件
*/
#include "stdint.h"
/*------------------------------------------------------------------------------------------------------------------
函数声明
*/
void xBSP_I2C_Simu_Config(void);
uint8_t xBSP_I2C_Simu_WriteOneByte(uint8_t devAddr, uint8_t reg, uint8_t value);
uint8_t xBSP_I2C_Simu_ReadOneByte(uint8_t devAddr, uint8_t reg);
#endif
/**************************************************END OF FILE**********************************************************/
xBSP_I2C_Simu.c
/**************************************************START OF FILE*****************************************************/
// 要移植的函数
// SDA_IN() 配置SDA的IO为输入
// SDA_OUT() 配置SDA的IO为输出
// IIC_SCL(level) 设置SCL的输出电平
// IIC_SDA(level) 设置SDA的输出电平
// READ_SDA() 读取输入SDA的电平
// xBSP_I2C_Delay 延时函数
/*------------------------------------------------------------------------------------------------------------------
包含头文件
*/
#include "stdint.h"
#include "fsl_gpio.h"
#include "fsl_iomuxc.h"
#include "xBSP_RT_PinConfig.h"
#include "xBSP_Config.h"
/*------------------------------------------------------------------------------------------------------------------
宏定义
*/
//IO方向设置
#define SDA_IN() do{xBSP_IIC_SDA_Input_Init();}while(0)
#define SDA_OUT() do{xBSP_IIC_SDA_Output_Init();}while(0)
//IO操作
#define IIC_SCL(level) do{GPIO_WritePinOutput(GPIO1 , 20 , level);}while(0) //SCL
#define IIC_SDA(level) do{GPIO_WritePinOutput(GPIO1 , 17 , level);}while(0) //SDA
#define READ_SDA() GPIO_ReadPinInput(GPIO1 , 17)//输入SDA
//DSA
#define PIN_CONFIG_IICSDA (SRE_0_SLOW_SLEW_RATE | DSE_1_R0_1 | SPEED_2_MEDIUM_100MHz | ODE_1_OPEN_DRAIN_ENABLED | PKE_1_PULL_KEEPER_ENABLED | PUE_1_PULL_SELECTED | PUS_3_22K_OHM_PULL_UP | HYS_0_HYSTERESIS_DISABLED)
//SCL
#define PIN_CONFIG_IICSCL (SRE_1_FAST_SLEW_RATE | DSE_1_R0_1 | SPEED_3_MAX_200MHz | ODE_0_OPEN_DRAIN_DISABLED | PKE_1_PULL_KEEPER_ENABLED | PUE_1_PULL_SELECTED | PUS_3_22K_OHM_PULL_UP | HYS_0_HYSTERESIS_DISABLED)
/*------------------------------------------------------------------------------------------------------------------
函数声明
*/
static void xBSP_I2C_Simu_Start(void); //发送IIC开始信号
static void xBSP_I2C_Simu_Stop(void); //发送IIC停止信号
static void xBSP_I2C_Simu_Ack(void); //IIC发送ACK信号
static void xBSP_I2C_Simu_NAck(void); //IIC不发送ACK信号
static uint8_t xBSP_I2C_Simu_Wait_Ack(void); //IIC等待ACK信号
/*
*********************************************************************************************************************
@ Brief : 延时函数
@ Param : NONE
@ Return : NONE
@ Author : YWJ(QQ:872180981)
@ Data : 2021-02-03 20:29
*********************************************************************************************************************
*/
void xBSP_I2C_Delay(uint32_t delay)
{
xBSP_CONFIG_DelayUs(delay);
}
/*
*********************************************************************************************************************
@ Brief : 初始化这个模拟的IIC,不同平能要移植。
@ Param : NONE
@ Return : NONE
@ Author : YWJ
@ Data : 2020-05-19 19:07
*********************************************************************************************************************
*/
void xBSP_I2C_Simu_Config(void)
{
gpio_pin_config_t gpio_config;
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_03_GPIOMUX_IO17,0U);
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_06_GPIOMUX_IO20,0U);
IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_06_GPIOMUX_IO20,PIN_CONFIG_IICSCL);
IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_03_GPIOMUX_IO17,PIN_CONFIG_IICSDA);
gpio_config.direction = kGPIO_DigitalOutput; //输出模式
gpio_config.outputLogic = 0; //默认高电平
gpio_config.interruptMode = kGPIO_NoIntmode; //不使用中断
GPIO_PinInit(GPIO1, 17, &gpio_config); //SDA
GPIO_PinInit(GPIO1, 20, &gpio_config); //SCL
IIC_SCL(1);
IIC_SDA(1);
}
/*
***************************************************************************************************************
@ Name : xBSP_IIC_SDA_Output_Init
@ Brief : IIC SDA引脚配置为输出模式
@ Param : NONE
@ Return : NONE
@ Author : WZB
@ Date : 2019 - 04 - 26
***************************************************************************************************************
*/
void xBSP_IIC_SDA_Output_Init(void)
{
gpio_pin_config_t gpio_config;
gpio_config.direction = kGPIO_DigitalOutput; //输出模式
gpio_config.outputLogic = 0; //默认高电平
gpio_config.interruptMode = kGPIO_NoIntmode; //不使用中断
GPIO_PinInit(GPIO1, 17, &gpio_config); //SDA
}
/*
***************************************************************************************************************
@ Name : xBSP_IIC_SDA_Output_Init
@ Brief : IIC SDA引脚配置为输入模式
@ Param : NONE
@ Return : NONE
@ Author : WZB
@ Date : 2019 - 04 - 26
***************************************************************************************************************
*/
void xBSP_IIC_SDA_Input_Init(void)
{
gpio_pin_config_t gpio_config;
gpio_config.direction = kGPIO_DigitalInput; //输出模式
gpio_config.outputLogic = 0; //默认高电平
gpio_config.interruptMode = kGPIO_NoIntmode; //不使用中断
GPIO_PinInit(GPIO1, 17, &gpio_config); //SDA
}
/*
***************************************************************************************************************
@ Name : xBSP_I2C_Simu_Start
@ Brief : IIC 产生IIC起始信号
@ Param : NONE
@ Return : NONE
@ Author : WZB
@ Date : 2019 - 04 - 26
***************************************************************************************************************
*/
void xBSP_I2C_Simu_Start(void)
{
SDA_OUT(); //sda线输出
IIC_SDA(1);
IIC_SCL(1);
xBSP_I2C_Delay(4);
IIC_SDA(0);//START:when CLK is high,DATA change form high to low
xBSP_I2C_Delay(4);
IIC_SCL(0);//钳住I2C总线,准备发送或接收数据
}
/*
***************************************************************************************************************
@ Name : xBSP_I2C_Simu_Stop
@ Brief : IIC 产生IIC停止信号
@ Param : NONE
@ Return : NONE
@ Author : WZB
@ Date : 2019 - 04 - 26
***************************************************************************************************************
*/
void xBSP_I2C_Simu_Stop(void)
{
SDA_OUT();//sda线输出
IIC_SCL(0);
IIC_SDA(0);//STOP:when CLK is high DATA change form low to high
xBSP_I2C_Delay(4);
IIC_SCL(1);
IIC_SDA(1);//发送I2C总线结束信号
xBSP_I2C_Delay(4);
}
/*
***************************************************************************************************************
@ Name : xBSP_I2C_Simu_Wait_Ack
@ Brief : IIC 等待应答信号到来
@ Param : NONE
@ Return : 0-接收应答成功,1-接收应答失败
@ Author : WZB
@ Date : 2019 - 04 - 26
***************************************************************************************************************
*/
uint8_t xBSP_I2C_Simu_Wait_Ack(void)
{
uint8_t flag=0;
SDA_IN();
xBSP_I2C_Delay(10);
IIC_SCL(1);
xBSP_I2C_Delay(1);
flag = READ_SDA();
IIC_SCL(0);
return flag;
}
/*
***************************************************************************************************************
@ Name : xBSP_I2C_Simu_Ack
@ Brief : IIC 产生ACK应答
@ Param : NONE
@ Return : NONE
@ Author : WZB
@ Date : 2019 - 04 - 26
***************************************************************************************************************
*/
void xBSP_I2C_Simu_Ack(void)
{
IIC_SCL(0);
SDA_OUT();
IIC_SDA(0);
xBSP_I2C_Delay(2);
IIC_SCL(1);
xBSP_I2C_Delay(2);
IIC_SCL(0);
xBSP_I2C_Delay(2);
}
/*
***************************************************************************************************************
@ Name : xBSP_I2C_Simu_NAck
@ Brief : IIC 不产生ACK应答
@ Param : NONE
@ Return : NONE
@ Author : WZB
@ Date : 2019 - 04 - 26
***************************************************************************************************************
*/
void xBSP_I2C_Simu_NAck(void)
{
IIC_SCL(0);
SDA_OUT();
IIC_SDA(1);
xBSP_I2C_Delay(2);
IIC_SCL(1);
xBSP_I2C_Delay(2);
IIC_SCL(0);
xBSP_I2C_Delay(2);
}
/*
***************************************************************************************************************
@ Name : xBSP_I2C_Simu_Send_Byte
@ Brief : IIC 发送一个字节
@ Param : uint8_t txd:数据
@ Return : NONE
@ Author : WZB
@ Date : 2019 - 04 - 26
***************************************************************************************************************
*/
void xBSP_I2C_Simu_Send_Byte(uint8_t txd)
{
uint8_t t;
SDA_OUT();
for(t=0;t<8;t++)
{
IIC_SCL(0);
IIC_SDA((txd&0x80)>>7);
txd<<=1;
xBSP_I2C_Delay(2);
IIC_SCL(1);
xBSP_I2C_Delay(2);
}
IIC_SCL(0);
}
/*
***************************************************************************************************************
@ Name : xBSP_I2C_Simu_Read_Byte
@ Brief : IIC 读1个字节数据
@ Param : ack=1时,发送ACK,ack=0,发送nACK
@ Return : 读取到的数据
@ Author : WZB
@ Date : 2019 - 04 - 26
***************************************************************************************************************
*/
uint8_t xBSP_I2C_Simu_Read_Byte(uint8_t ack)
{
unsigned char i,receive=0;
SDA_IN();
for(i=0;i<8;i++ )
{
IIC_SCL(0);
xBSP_I2C_Delay(2);
IIC_SCL(1);
receive<<=1;
if(READ_SDA())
{
receive++;
}
xBSP_I2C_Delay(1);
}
if (!ack)
xBSP_I2C_Simu_NAck();
else
xBSP_I2C_Simu_Ack();
IIC_SCL(0);
return receive;
}
/*
***************************************************************************************************************
@ Name : xBSP_I2C_Simu_WriteOneByte
@ Brief : IIC 指定地址写入一字节数据
@ Param : uint8_t devAddr:设备地址
@ uint8_t reg:写入数据的寄存器地址
@ uint8_t value:要写入的数据
@ Return : 写入结果:0-写入成功,1-写入失败
@ Author : WZB
@ Date : 2019 - 04 - 26
***************************************************************************************************************
*/
uint8_t xBSP_I2C_Simu_WriteOneByte(uint8_t devAddr, uint8_t reg, uint8_t value)
{
uint8_t ackFlag=0;
xBSP_I2C_Simu_Start();
xBSP_I2C_Simu_Send_Byte(devAddr&(~0x01));
if(xBSP_I2C_Simu_Wait_Ack())while(1);
xBSP_I2C_Simu_Send_Byte(reg);
if(xBSP_I2C_Simu_Wait_Ack())while(1);
xBSP_I2C_Simu_Send_Byte(value);
if(xBSP_I2C_Simu_Wait_Ack())while(1);
xBSP_I2C_Simu_Stop();
return ackFlag;
}
/*
***************************************************************************************************************
@ Name : xBSP_I2C_Simu_ReadOneByte
@ Brief : IIC 指定地址读取一字节数据
@ Param : uint8_t devAddr:设备地址
@ uint8_t reg:写入数据的寄存器地址
@ Return : 读取到的数据
@ Author : WZB
@ Date : 2019 - 04 - 26
***************************************************************************************************************
*/
uint8_t xBSP_I2C_Simu_ReadOneByte(uint8_t devAddr, uint8_t reg)
{
uint8_t rb = 0;
//写寄存器地址
xBSP_I2C_Simu_Start();
xBSP_I2C_Simu_Send_Byte(devAddr&(~0x01));
if(xBSP_I2C_Simu_Wait_Ack()) while(1);
xBSP_I2C_Simu_Send_Byte(reg);
if(xBSP_I2C_Simu_Wait_Ack()) while(1);
//读数据
xBSP_I2C_Simu_Start();
xBSP_I2C_Simu_Send_Byte(devAddr | 0x01);
if(xBSP_I2C_Simu_Wait_Ack())while(1);
rb=xBSP_I2C_Simu_Read_Byte(0);
xBSP_I2C_Simu_Stop();
return rb ;
}
/**************************************************END OF FILE*******************************************************/
xBSP_Codec_CS4272.h
#ifndef __XBSP_CODEC_CS4272_H
#define __XBSP_CODEC_CS4272_H
#include "stdint.h"
/*****************************************************************************************
* @brief CS4272 初使化
* @return uint32_t 成功返回 BSP_STATE_OK
*****************************************************************************************/
uint32_t xBSP_Codec_CS4272_Init(void);
#endif
/**************************************************END OF FILE**********************************************************/
xBSP_Codec_CS4272.c
/**************************************************START OF FILE*****************************************************/
// void xBSP_Codec_CS4272_Reset(void)
/*------------------------------------------------------------------------------------------------------------------
Includes
*/
#include <stdio.h>
#include "xBSP_I2C_Simu.h"
#include "fsl_gpio.h"
#include "fsl_iomuxc.h"
#include "xBSP_RT_PinConfig.h"
#include "xBSP_Config.h"
//地址高7位有效
#define CS4272_DEVICES_ADDR 0x20
const uint8_t cs4272_config_table[][2] =
{
// 寄存器地址, 值
0x01,0x01, //从模式
// 0x01,0x29, //主模式
/*模式控制1
B0~B2: 音频数字接口模式
0:左对齐,最高24位数据(默认值)
1:通用I2S格式,最高24位数据
2:右对齐,16位
3:右对齐,24位
4:右对齐,20位
5:右对齐,18位
6:无效值
7:无效值
B3: 主/从模式
0:从模式(默认值)
1:主模式
B4~B5: 时钟比率选择
见手册第28页
B5~B7: 采样范围选择
0:单速度模式4~50KHz(默认值)
1:单速度模式4~50KHz
2:双速度模式50~100KHz
2:4速度模式100~200KHz
*/
0x02,0x00,/*DAC 控制
B0:通道B输出反相
B1:通道A输出反相
B4-B5:DEM0,DEM1,去加重选择
DEM1 DEM0
0 0 关闭
0 1 44.1K
1 0 48K
1 1 32K
B7:自动静音功能
*/
0x03,0x26,/*DAC & 混合控制
B0-B3:输出通道混合控制
B6:为1通道B的音量等于通道A
*/
0x04,0x00,/*DAC通道A音量控制,范围0-127
*/
0x05,0x00,/*DAC通道B音量控制
*/
0x06,0x10,/*ADC控制
B0:通道B高通滤波器开关,1关,0开
B1:通道A高通滤波器开关,1关,0开
B2:通道B静音
B3:通道A静音
B4:ADC数字接口模式
0 左对齐,最高24位数据
1 I2S通用格式,最高24位数据
*/
0x07,0x02,/*模式控制2
B0: 低功耗控制
0:正常运行
1:进入低功耗
B1:控制商品使能
B3:通道A的静音状态 = 通道B
*/
0x08, 0x00/* 芯片ID
*/
};
#define CS4272_REG_MAX (sizeof(cs4272_config_table) / 2)
/*
*********************************************************************************************************************
@ Brief : Codec复位
@ Param : NONE
@ Return : NONE
@ Author : YWJ(QQ:872180981)
@ Data : 2021-02-02 14:18
*********************************************************************************************************************
*/
#define PIN_CONFIG_RESET (SRE_0_SLOW_SLEW_RATE | DSE_6_R0_6 | SPEED_2_MEDIUM_100MHz | ODE_1_OPEN_DRAIN_ENABLED | PKE_1_PULL_KEEPER_ENABLED | PUE_1_PULL_SELECTED | PUS_2_100K_OHM_PULL_UP | HYS_0_HYSTERESIS_DISABLED)
void xBSP_Codec_CS4272_Reset(void)
{
//复位引脚的配置
gpio_pin_config_t gpio_config;
IOMUXC_SetPinMux(IOMUXC_GPIO_B1_15_GPIO2_IO31,0U);
IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_15_GPIO2_IO31,PIN_CONFIG_RESET);
gpio_config.direction = kGPIO_DigitalOutput; //输出模式
gpio_config.outputLogic = 0; //默认高电平
gpio_config.interruptMode = kGPIO_NoIntmode; //不使用中断
GPIO_PinInit(GPIO2, 31, &gpio_config);
//Reset
GPIO_WritePinOutput(GPIO2 , 31 , 0x00);
xBSP_CONFIG_DelayUs(150 * MS_COUNT);
GPIO_WritePinOutput(GPIO2 , 31 , 0x01);
xBSP_CONFIG_DelayUs(10 * MS_COUNT);
}
/*
*********************************************************************************************************************
@ Brief : 初始化CS4272
@ Param : NONE
@ Return : NONE
@ Author : YWJ(QQ:872180981)
@ Data : 2021-02-02 14:08
*********************************************************************************************************************
*/
uint32_t xBSP_Codec_CS4272_Init(void)
{
uint8_t value = 0;
uint32_t res = 0;
xBSP_Codec_CS4272_Reset();
//写入寄存器
for (uint32_t i = 0; i < CS4272_REG_MAX; i++)
{
res = xBSP_I2C_Simu_WriteOneByte(CS4272_DEVICES_ADDR , cs4272_config_table[i][0] , cs4272_config_table[i][1]);
if(res == 1)
{
while (1);
}
}
//读出来比较(最后一个ID不比较)
for (uint32_t i = 0; i < CS4272_REG_MAX - 1; i++)
{
value = xBSP_I2C_Simu_ReadOneByte(CS4272_DEVICES_ADDR , cs4272_config_table[i][0]);
if(cs4272_config_table[i][1] != value)
{
while (1);
}
}
return res;
}
/**************************************************END OF FILE*******************************************************/
二、资料下载
由于百度网盘会更新,可以进群看QQ公告.所以资料都会在同一个地址分享.
QQ:872180981
群号:339420387
版权声明:本文为CSDN博主「客西电子」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sandyde123/article/details/122323970
一、直接上代码:
xBSP_I2C_Simu.h
#ifndef __xBSP_I2C_SIMU_H
#define __xBSP_I2C_SIMU_H
/**************************************************START OF FILE*****************************************************/
/*------------------------------------------------------------------------------------------------------------------
包含头文件
*/
#include "stdint.h"
/*------------------------------------------------------------------------------------------------------------------
函数声明
*/
void xBSP_I2C_Simu_Config(void);
uint8_t xBSP_I2C_Simu_WriteOneByte(uint8_t devAddr, uint8_t reg, uint8_t value);
uint8_t xBSP_I2C_Simu_ReadOneByte(uint8_t devAddr, uint8_t reg);
#endif
/**************************************************END OF FILE**********************************************************/
xBSP_I2C_Simu.c
/**************************************************START OF FILE*****************************************************/
// 要移植的函数
// SDA_IN() 配置SDA的IO为输入
// SDA_OUT() 配置SDA的IO为输出
// IIC_SCL(level) 设置SCL的输出电平
// IIC_SDA(level) 设置SDA的输出电平
// READ_SDA() 读取输入SDA的电平
// xBSP_I2C_Delay 延时函数
/*------------------------------------------------------------------------------------------------------------------
包含头文件
*/
#include "stdint.h"
#include "fsl_gpio.h"
#include "fsl_iomuxc.h"
#include "xBSP_RT_PinConfig.h"
#include "xBSP_Config.h"
/*------------------------------------------------------------------------------------------------------------------
宏定义
*/
//IO方向设置
#define SDA_IN() do{xBSP_IIC_SDA_Input_Init();}while(0)
#define SDA_OUT() do{xBSP_IIC_SDA_Output_Init();}while(0)
//IO操作
#define IIC_SCL(level) do{GPIO_WritePinOutput(GPIO1 , 20 , level);}while(0) //SCL
#define IIC_SDA(level) do{GPIO_WritePinOutput(GPIO1 , 17 , level);}while(0) //SDA
#define READ_SDA() GPIO_ReadPinInput(GPIO1 , 17)//输入SDA
//DSA
#define PIN_CONFIG_IICSDA (SRE_0_SLOW_SLEW_RATE | DSE_1_R0_1 | SPEED_2_MEDIUM_100MHz | ODE_1_OPEN_DRAIN_ENABLED | PKE_1_PULL_KEEPER_ENABLED | PUE_1_PULL_SELECTED | PUS_3_22K_OHM_PULL_UP | HYS_0_HYSTERESIS_DISABLED)
//SCL
#define PIN_CONFIG_IICSCL (SRE_1_FAST_SLEW_RATE | DSE_1_R0_1 | SPEED_3_MAX_200MHz | ODE_0_OPEN_DRAIN_DISABLED | PKE_1_PULL_KEEPER_ENABLED | PUE_1_PULL_SELECTED | PUS_3_22K_OHM_PULL_UP | HYS_0_HYSTERESIS_DISABLED)
/*------------------------------------------------------------------------------------------------------------------
函数声明
*/
static void xBSP_I2C_Simu_Start(void); //发送IIC开始信号
static void xBSP_I2C_Simu_Stop(void); //发送IIC停止信号
static void xBSP_I2C_Simu_Ack(void); //IIC发送ACK信号
static void xBSP_I2C_Simu_NAck(void); //IIC不发送ACK信号
static uint8_t xBSP_I2C_Simu_Wait_Ack(void); //IIC等待ACK信号
/*
*********************************************************************************************************************
@ Brief : 延时函数
@ Param : NONE
@ Return : NONE
@ Author : YWJ(QQ:872180981)
@ Data : 2021-02-03 20:29
*********************************************************************************************************************
*/
void xBSP_I2C_Delay(uint32_t delay)
{
xBSP_CONFIG_DelayUs(delay);
}
/*
*********************************************************************************************************************
@ Brief : 初始化这个模拟的IIC,不同平能要移植。
@ Param : NONE
@ Return : NONE
@ Author : YWJ
@ Data : 2020-05-19 19:07
*********************************************************************************************************************
*/
void xBSP_I2C_Simu_Config(void)
{
gpio_pin_config_t gpio_config;
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_03_GPIOMUX_IO17,0U);
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_06_GPIOMUX_IO20,0U);
IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_06_GPIOMUX_IO20,PIN_CONFIG_IICSCL);
IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_03_GPIOMUX_IO17,PIN_CONFIG_IICSDA);
gpio_config.direction = kGPIO_DigitalOutput; //输出模式
gpio_config.outputLogic = 0; //默认高电平
gpio_config.interruptMode = kGPIO_NoIntmode; //不使用中断
GPIO_PinInit(GPIO1, 17, &gpio_config); //SDA
GPIO_PinInit(GPIO1, 20, &gpio_config); //SCL
IIC_SCL(1);
IIC_SDA(1);
}
/*
***************************************************************************************************************
@ Name : xBSP_IIC_SDA_Output_Init
@ Brief : IIC SDA引脚配置为输出模式
@ Param : NONE
@ Return : NONE
@ Author : WZB
@ Date : 2019 - 04 - 26
***************************************************************************************************************
*/
void xBSP_IIC_SDA_Output_Init(void)
{
gpio_pin_config_t gpio_config;
gpio_config.direction = kGPIO_DigitalOutput; //输出模式
gpio_config.outputLogic = 0; //默认高电平
gpio_config.interruptMode = kGPIO_NoIntmode; //不使用中断
GPIO_PinInit(GPIO1, 17, &gpio_config); //SDA
}
/*
***************************************************************************************************************
@ Name : xBSP_IIC_SDA_Output_Init
@ Brief : IIC SDA引脚配置为输入模式
@ Param : NONE
@ Return : NONE
@ Author : WZB
@ Date : 2019 - 04 - 26
***************************************************************************************************************
*/
void xBSP_IIC_SDA_Input_Init(void)
{
gpio_pin_config_t gpio_config;
gpio_config.direction = kGPIO_DigitalInput; //输出模式
gpio_config.outputLogic = 0; //默认高电平
gpio_config.interruptMode = kGPIO_NoIntmode; //不使用中断
GPIO_PinInit(GPIO1, 17, &gpio_config); //SDA
}
/*
***************************************************************************************************************
@ Name : xBSP_I2C_Simu_Start
@ Brief : IIC 产生IIC起始信号
@ Param : NONE
@ Return : NONE
@ Author : WZB
@ Date : 2019 - 04 - 26
***************************************************************************************************************
*/
void xBSP_I2C_Simu_Start(void)
{
SDA_OUT(); //sda线输出
IIC_SDA(1);
IIC_SCL(1);
xBSP_I2C_Delay(4);
IIC_SDA(0);//START:when CLK is high,DATA change form high to low
xBSP_I2C_Delay(4);
IIC_SCL(0);//钳住I2C总线,准备发送或接收数据
}
/*
***************************************************************************************************************
@ Name : xBSP_I2C_Simu_Stop
@ Brief : IIC 产生IIC停止信号
@ Param : NONE
@ Return : NONE
@ Author : WZB
@ Date : 2019 - 04 - 26
***************************************************************************************************************
*/
void xBSP_I2C_Simu_Stop(void)
{
SDA_OUT();//sda线输出
IIC_SCL(0);
IIC_SDA(0);//STOP:when CLK is high DATA change form low to high
xBSP_I2C_Delay(4);
IIC_SCL(1);
IIC_SDA(1);//发送I2C总线结束信号
xBSP_I2C_Delay(4);
}
/*
***************************************************************************************************************
@ Name : xBSP_I2C_Simu_Wait_Ack
@ Brief : IIC 等待应答信号到来
@ Param : NONE
@ Return : 0-接收应答成功,1-接收应答失败
@ Author : WZB
@ Date : 2019 - 04 - 26
***************************************************************************************************************
*/
uint8_t xBSP_I2C_Simu_Wait_Ack(void)
{
uint8_t flag=0;
SDA_IN();
xBSP_I2C_Delay(10);
IIC_SCL(1);
xBSP_I2C_Delay(1);
flag = READ_SDA();
IIC_SCL(0);
return flag;
}
/*
***************************************************************************************************************
@ Name : xBSP_I2C_Simu_Ack
@ Brief : IIC 产生ACK应答
@ Param : NONE
@ Return : NONE
@ Author : WZB
@ Date : 2019 - 04 - 26
***************************************************************************************************************
*/
void xBSP_I2C_Simu_Ack(void)
{
IIC_SCL(0);
SDA_OUT();
IIC_SDA(0);
xBSP_I2C_Delay(2);
IIC_SCL(1);
xBSP_I2C_Delay(2);
IIC_SCL(0);
xBSP_I2C_Delay(2);
}
/*
***************************************************************************************************************
@ Name : xBSP_I2C_Simu_NAck
@ Brief : IIC 不产生ACK应答
@ Param : NONE
@ Return : NONE
@ Author : WZB
@ Date : 2019 - 04 - 26
***************************************************************************************************************
*/
void xBSP_I2C_Simu_NAck(void)
{
IIC_SCL(0);
SDA_OUT();
IIC_SDA(1);
xBSP_I2C_Delay(2);
IIC_SCL(1);
xBSP_I2C_Delay(2);
IIC_SCL(0);
xBSP_I2C_Delay(2);
}
/*
***************************************************************************************************************
@ Name : xBSP_I2C_Simu_Send_Byte
@ Brief : IIC 发送一个字节
@ Param : uint8_t txd:数据
@ Return : NONE
@ Author : WZB
@ Date : 2019 - 04 - 26
***************************************************************************************************************
*/
void xBSP_I2C_Simu_Send_Byte(uint8_t txd)
{
uint8_t t;
SDA_OUT();
for(t=0;t<8;t++)
{
IIC_SCL(0);
IIC_SDA((txd&0x80)>>7);
txd<<=1;
xBSP_I2C_Delay(2);
IIC_SCL(1);
xBSP_I2C_Delay(2);
}
IIC_SCL(0);
}
/*
***************************************************************************************************************
@ Name : xBSP_I2C_Simu_Read_Byte
@ Brief : IIC 读1个字节数据
@ Param : ack=1时,发送ACK,ack=0,发送nACK
@ Return : 读取到的数据
@ Author : WZB
@ Date : 2019 - 04 - 26
***************************************************************************************************************
*/
uint8_t xBSP_I2C_Simu_Read_Byte(uint8_t ack)
{
unsigned char i,receive=0;
SDA_IN();
for(i=0;i<8;i++ )
{
IIC_SCL(0);
xBSP_I2C_Delay(2);
IIC_SCL(1);
receive<<=1;
if(READ_SDA())
{
receive++;
}
xBSP_I2C_Delay(1);
}
if (!ack)
xBSP_I2C_Simu_NAck();
else
xBSP_I2C_Simu_Ack();
IIC_SCL(0);
return receive;
}
/*
***************************************************************************************************************
@ Name : xBSP_I2C_Simu_WriteOneByte
@ Brief : IIC 指定地址写入一字节数据
@ Param : uint8_t devAddr:设备地址
@ uint8_t reg:写入数据的寄存器地址
@ uint8_t value:要写入的数据
@ Return : 写入结果:0-写入成功,1-写入失败
@ Author : WZB
@ Date : 2019 - 04 - 26
***************************************************************************************************************
*/
uint8_t xBSP_I2C_Simu_WriteOneByte(uint8_t devAddr, uint8_t reg, uint8_t value)
{
uint8_t ackFlag=0;
xBSP_I2C_Simu_Start();
xBSP_I2C_Simu_Send_Byte(devAddr&(~0x01));
if(xBSP_I2C_Simu_Wait_Ack())while(1);
xBSP_I2C_Simu_Send_Byte(reg);
if(xBSP_I2C_Simu_Wait_Ack())while(1);
xBSP_I2C_Simu_Send_Byte(value);
if(xBSP_I2C_Simu_Wait_Ack())while(1);
xBSP_I2C_Simu_Stop();
return ackFlag;
}
/*
***************************************************************************************************************
@ Name : xBSP_I2C_Simu_ReadOneByte
@ Brief : IIC 指定地址读取一字节数据
@ Param : uint8_t devAddr:设备地址
@ uint8_t reg:写入数据的寄存器地址
@ Return : 读取到的数据
@ Author : WZB
@ Date : 2019 - 04 - 26
***************************************************************************************************************
*/
uint8_t xBSP_I2C_Simu_ReadOneByte(uint8_t devAddr, uint8_t reg)
{
uint8_t rb = 0;
//写寄存器地址
xBSP_I2C_Simu_Start();
xBSP_I2C_Simu_Send_Byte(devAddr&(~0x01));
if(xBSP_I2C_Simu_Wait_Ack()) while(1);
xBSP_I2C_Simu_Send_Byte(reg);
if(xBSP_I2C_Simu_Wait_Ack()) while(1);
//读数据
xBSP_I2C_Simu_Start();
xBSP_I2C_Simu_Send_Byte(devAddr | 0x01);
if(xBSP_I2C_Simu_Wait_Ack())while(1);
rb=xBSP_I2C_Simu_Read_Byte(0);
xBSP_I2C_Simu_Stop();
return rb ;
}
/**************************************************END OF FILE*******************************************************/
xBSP_Codec_CS4272.h
#ifndef __XBSP_CODEC_CS4272_H
#define __XBSP_CODEC_CS4272_H
#include "stdint.h"
/*****************************************************************************************
* @brief CS4272 初使化
* @return uint32_t 成功返回 BSP_STATE_OK
*****************************************************************************************/
uint32_t xBSP_Codec_CS4272_Init(void);
#endif
/**************************************************END OF FILE**********************************************************/
xBSP_Codec_CS4272.c
/**************************************************START OF FILE*****************************************************/
// void xBSP_Codec_CS4272_Reset(void)
/*------------------------------------------------------------------------------------------------------------------
Includes
*/
#include <stdio.h>
#include "xBSP_I2C_Simu.h"
#include "fsl_gpio.h"
#include "fsl_iomuxc.h"
#include "xBSP_RT_PinConfig.h"
#include "xBSP_Config.h"
//地址高7位有效
#define CS4272_DEVICES_ADDR 0x20
const uint8_t cs4272_config_table[][2] =
{
// 寄存器地址, 值
0x01,0x01, //从模式
// 0x01,0x29, //主模式
/*模式控制1
B0~B2: 音频数字接口模式
0:左对齐,最高24位数据(默认值)
1:通用I2S格式,最高24位数据
2:右对齐,16位
3:右对齐,24位
4:右对齐,20位
5:右对齐,18位
6:无效值
7:无效值
B3: 主/从模式
0:从模式(默认值)
1:主模式
B4~B5: 时钟比率选择
见手册第28页
B5~B7: 采样范围选择
0:单速度模式4~50KHz(默认值)
1:单速度模式4~50KHz
2:双速度模式50~100KHz
2:4速度模式100~200KHz
*/
0x02,0x00,/*DAC 控制
B0:通道B输出反相
B1:通道A输出反相
B4-B5:DEM0,DEM1,去加重选择
DEM1 DEM0
0 0 关闭
0 1 44.1K
1 0 48K
1 1 32K
B7:自动静音功能
*/
0x03,0x26,/*DAC & 混合控制
B0-B3:输出通道混合控制
B6:为1通道B的音量等于通道A
*/
0x04,0x00,/*DAC通道A音量控制,范围0-127
*/
0x05,0x00,/*DAC通道B音量控制
*/
0x06,0x10,/*ADC控制
B0:通道B高通滤波器开关,1关,0开
B1:通道A高通滤波器开关,1关,0开
B2:通道B静音
B3:通道A静音
B4:ADC数字接口模式
0 左对齐,最高24位数据
1 I2S通用格式,最高24位数据
*/
0x07,0x02,/*模式控制2
B0: 低功耗控制
0:正常运行
1:进入低功耗
B1:控制商品使能
B3:通道A的静音状态 = 通道B
*/
0x08, 0x00/* 芯片ID
*/
};
#define CS4272_REG_MAX (sizeof(cs4272_config_table) / 2)
/*
*********************************************************************************************************************
@ Brief : Codec复位
@ Param : NONE
@ Return : NONE
@ Author : YWJ(QQ:872180981)
@ Data : 2021-02-02 14:18
*********************************************************************************************************************
*/
#define PIN_CONFIG_RESET (SRE_0_SLOW_SLEW_RATE | DSE_6_R0_6 | SPEED_2_MEDIUM_100MHz | ODE_1_OPEN_DRAIN_ENABLED | PKE_1_PULL_KEEPER_ENABLED | PUE_1_PULL_SELECTED | PUS_2_100K_OHM_PULL_UP | HYS_0_HYSTERESIS_DISABLED)
void xBSP_Codec_CS4272_Reset(void)
{
//复位引脚的配置
gpio_pin_config_t gpio_config;
IOMUXC_SetPinMux(IOMUXC_GPIO_B1_15_GPIO2_IO31,0U);
IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_15_GPIO2_IO31,PIN_CONFIG_RESET);
gpio_config.direction = kGPIO_DigitalOutput; //输出模式
gpio_config.outputLogic = 0; //默认高电平
gpio_config.interruptMode = kGPIO_NoIntmode; //不使用中断
GPIO_PinInit(GPIO2, 31, &gpio_config);
//Reset
GPIO_WritePinOutput(GPIO2 , 31 , 0x00);
xBSP_CONFIG_DelayUs(150 * MS_COUNT);
GPIO_WritePinOutput(GPIO2 , 31 , 0x01);
xBSP_CONFIG_DelayUs(10 * MS_COUNT);
}
/*
*********************************************************************************************************************
@ Brief : 初始化CS4272
@ Param : NONE
@ Return : NONE
@ Author : YWJ(QQ:872180981)
@ Data : 2021-02-02 14:08
*********************************************************************************************************************
*/
uint32_t xBSP_Codec_CS4272_Init(void)
{
uint8_t value = 0;
uint32_t res = 0;
xBSP_Codec_CS4272_Reset();
//写入寄存器
for (uint32_t i = 0; i < CS4272_REG_MAX; i++)
{
res = xBSP_I2C_Simu_WriteOneByte(CS4272_DEVICES_ADDR , cs4272_config_table[i][0] , cs4272_config_table[i][1]);
if(res == 1)
{
while (1);
}
}
//读出来比较(最后一个ID不比较)
for (uint32_t i = 0; i < CS4272_REG_MAX - 1; i++)
{
value = xBSP_I2C_Simu_ReadOneByte(CS4272_DEVICES_ADDR , cs4272_config_table[i][0]);
if(cs4272_config_table[i][1] != value)
{
while (1);
}
}
return res;
}
/**************************************************END OF FILE*******************************************************/
二、资料下载
由于百度网盘会更新,可以进群看QQ公告.所以资料都会在同一个地址分享.
QQ:872180981
群号:339420387
版权声明:本文为CSDN博主「客西电子」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sandyde123/article/details/122323970
暂无评论