#include "tlv.h"
int fd; // SPI设备文件描述符
int mode = SPI_MODE_0; // SPI模式
int bits = 16; // 每字比特数
int speed = 10000000; // 最大SPI总线速度(Hz)
int delay; // 延迟时间(微秒)
/*
* 初始化SPI通信.
* 返回0表示成功,-1表示失败.
*/
int spi_init(void){
int ret;
// 打开SPI设备文件
fd = open("/dev/spidev7.0", O_RDWR);
if(fd < 0){
printf("打开 /dev/spidev7.0 错误\n");
return -1;
}
/*
* 设置SPI模式
*/
ret = ioctl(fd, SPI_IOC_WR_MODE32, &mode);
if (ret == -1)
printf("无法设置SPI模式\n");
ret = ioctl(fd, SPI_IOC_RD_MODE32, &mode);
if (ret == -1)
printf("无法获取SPI模式\n");
/*
* 设置每字比特数
*/
ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
if (ret == -1)
printf("无法设置每字比特数\n");
ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
if (ret == -1)
printf("无法获取每字比特数\n");
/*
* 设置最大传输速度
*/
ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
if (ret == -1)
printf("无法设置最大传输速度\n");
ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
if (ret == -1)
printf("无法获取最大传输速度\n");
printf("SPI模式: 0x%x\n", mode);
printf("每字比特数: %d\n", bits);
printf("最大速度: %d Hz (%d KHz)\n", speed, speed / 1000);
return 0;
}
/*
* 执行SPI数据传输.
* 参数:
* fd - SPI设备文件描述符
* tx - 发送缓冲区
* rx - 接收缓冲区
* len - 数据长度
* 返回0表示成功,-1表示失败.
*/
int transfer(int fd, u_int16_t *tx, u_int16_t *rx, int len)
{
int ret;
struct spi_ioc_transfer tr = {
.tx_buf = (unsigned long)tx,
.rx_buf = (unsigned long)rx,
.len = len,
.delay_usecs = delay,
.speed_hz = speed,
.bits_per_word = bits,
};
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
if (ret < 1){
printf("无法发送SPI消息\n");
return -1;
}
return 0;
}
u_int16_t tvWriteRegister(u_int16_t reg, u_int16_t value)
{
u_int16_t txdata[2];
txdata[0]=reg;
txdata[1]=value;
transfer(fd, txdata, NULL, sizeof(txdata));
return 0;
}
u_int16_t tvReadRegister(u_int16_t reg)
{
u_int16_t txdata[2]={0},rxdata[2]={0};
txdata[0]=reg;
txdata[1]=0;
transfer(fd, txdata, rxdata, sizeof(rxdata));
return(rxdata[1]);
}
void tvInit(void)
{
u_int16_t reg = 0;
u_int16_t data = 0;
tvWriteRegister(AIC26_REG_RESET, 0xbb00);//Writing the code OxBBOO, Reset all register
tvWriteRegister(AIC26_REG_AUX_ADC, 0x3e0);
tvWriteRegister(AIC26_REG_REFERENCE, 0x17);
data = tvReadRegister(AIC26_REG_REFERENCE);
if(data != 0x17)
printf("init audio codec failed\n\n");
else
printf("init codec success\n\n");
tvWriteRegister(AIC26_REG_AUDIO_CTRL1, 0x013f); //DSP mode
//tvWriteRegister(AIC26_REG_AUDIO_CTRL1,0x003f);//I2S mode
tvWriteRegister(AIC26_REG_ADC_GAIN, 0x3400);
//tvWriteRegister(AIC26_REG_ADC_GAIN,0x2800);
//tvWriteRegister(AIC26_REG_ADC_GAIN,0x0);
//tvWriteRegister(AIC26_REG_DAC_GAIN,0x8080);
tvWriteRegister(AIC26_REG_DAC_GAIN, 0x0202);
tvWriteRegister(AIC26_REG_SIDETONE, 0x8080);
tvWriteRegister(AIC26_REG_POWER_CTRL, 0xa700);
tvWriteRegister(AIC26_REG_AUDIO_CTRL2, 0x0);
#if 0
tvWriteRegister(AIC26 REG AUDIO CTRL3,0x09fb);//Master bit11-1
printf(“init codec Master mode\n”);
#else
tvWriteRegister(AIC26_REG_AUDIO_CTRL3,0x01fb); //Slave bit11-0
printf("init codec Slave mode\n");
#endif
tvWriteRegister(AIC26_REG_FILTER_COEFF_L_N0, 0x7fff);
tvWriteRegister(AIC26_REG_FILTER_COEFF_R_N0, 0x7fff);
tvWriteRegister(AIC26_REG_FILTER_COEFF_L_N1, 0x81a6);
tvWriteRegister(AIC26_REG_FILTER_COEFF_R_N1, 0x81a6);
tvWriteRegister(AIC26_REG_FILTER_COEFF_L_N2, 0x7cb5);
tvWriteRegister(AIC26_REG_FILTER_COEFF_R_N2, 0x7cb5);
tvWriteRegister(AIC26_REG_FILTER_COEFF_L_N3, 0x7fff);
tvWriteRegister(AIC26_REG_FILTER_COEFF_R_N3, 0x7fff);
tvWriteRegister(AIC26_REG_FILTER_COEFF_L_N4, 0x0);
tvWriteRegister(AIC26_REG_FILTER_COEFF_R_N4, 0x0);
tvWriteRegister(AIC26_REG_FILTER_COEFF_L_N5, 0x0);
tvWriteRegister(AIC26_REG_FILTER_COEFF_R_N5, 0x0);
tvWriteRegister(AIC26_REG_FILTER_COEFF_L_D1, 0x7fe2);
tvWriteRegister(AIC26_REG_FILTER_COEFF_R_D1, 0x7fe2);
tvWriteRegister(AIC26_REG_FILTER_COEFF_L_D2, 0x803c);
tvWriteRegister(AIC26_REG_FILTER_COEFF_R_D2, 0x803c);
tvWriteRegister(AIC26_REG_FILTER_COEFF_L_D4, 0x0);
tvWriteRegister(AIC26_REG_FILTER_COEFF_R_D4, 0x0);
tvWriteRegister(AIC26_REG_FILTER_COEFF_L_D5, 0x0);
tvWriteRegister(AIC26_REG_FILTER_COEFF_R_D5, 0x0);
tvWriteRegister(AIC26_REG_AUDIO_CTRL4, 0x1000);
tvWriteRegister(AIC26_REG_AUDIO_CTRL5, 0xedb0);
tvWriteRegister(AIC26_REG_PLL_PROG1, 0x8120);
tvWriteRegister(AIC26_REG_PLL_PROG2, 0x1e00);
//tvWriteRegister(AIC26_REG_POWER_CTRL_0x3191);
tvWriteRegister(AIC26_REG_POWER_CTRL, 0x3091);
reg = tvReadRegister(AIC26_REG_ADC_GAIN);
reg = reg & (~(0x1f << 15));
tvWriteRegister(AIC26_REG_ADC_GAIN, reg);
}
int main(int argc, char *argv[])
{
spi_init();
tvInit();
return 0;
}
执行这个代码报错了,能不能帮忙看一下是我transfer,tvReadRegister,tvWriteRegister这些函数哪里错误了,导致初始化音频驱动报错了。

