音频开发-----MCU配置CODEC之CS4272

一、直接上代码:

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

生成海报
点赞 0

客西电子

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

分享灵动微MM32F3270微控制器的音频类产品参考方案

音频设备主要是对音频输入输出设备的总称,其包括的产品类型也很多,一般可以分为以下几种:功放机、音箱、多媒体控制台、数字调音台、音频采样卡、合成器、中高频音箱、话筒,PC中的声卡、耳机等&#

GD32F103配置SPI+DMA收发数据

GD32是国产的32位单片机,它和STM32非常非常像,就连以前的库函数都差不多(现在从GD官网下载的库函数换了一种风格)。配置SPI和DMA的方法和STM32差不多。 上图是DMA0各通