#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; }


