CC26xx I2S
来源:互联网 发布:win10仿mac 编辑:程序博客网 时间:2024/05/18 22:17
摘自:https://e2e.ti.com/support/wireless_connectivity/zigbee_6lowpan_802-15-4_mac/f/158/p/462156/1746186
/* * main.c * * Created on: 4 Apr, 2016 * Author: Lenovo *//* Board Header files */#include "Board.h"/* BIOS Header files */#include <ti/sysbios/BIOS.h>#include <ti/sysbios/knl/Task.h>#include <ti/sysbios/knl/Semaphore.h>#include <ti/sysbios/knl/Clock.h>/* XDCtools Header files */#include <stdlib.h>#include <stdint.h>#include <stdio.h>#include <string.h>#include <xdc/std.h>#include <xdc/runtime/System.h>#include <xdc/runtime/Error.h>/* HW Header files */#include <inc/hw_types.h>#include <inc/hw_ints.h>/* RF Header files */#include "rfEasyLinkTx.h"/* UART Header files */#include <ti/drivers/UART.h> //RTOS/* AON IOC Header files */#include <driverlib/aon_ioc.h>#include <inc/hw_aon_ioc.h>/* I2S Header files */#include <driverlib/i2s.h>#include <driverlib/prcm.h>#include <ti/drivers/pin/PINCC26XX.h>/* Power Header files */#include <ti/drivers/Power.h> //RTOS#include <ti/drivers/power/PowerCC26XX.h>/* SSI Header files */#include <ti/drivers/SPI.h>#include <ti/drivers/spi/SPICC26XXDMA.h>#include <ti/drivers/dma/UDMACC26XX.h>#define BCLK_DIV (16) //BCLK division 48MHz/16 = 3MHz//#define BCLK_DIV (24) //BCLK division 48MHz/16 = 2MHz//#define BCLK_DIV (48) //BCLK division 48MHz/16 = 1MHz#define WCLK (IOID_6)#define BCLK (IOID_7)#define MISO (IOID_1)#define I2S_BUFF_SIZE (512)#define I2S_BUFF_IN_NUM (2)#define I2S_BUFF_OUT_NUM (1)int32_t i2s_in[I2S_BUFF_SIZE];int32_t i2s_out[I2S_BUFF_SIZE];int32_t mic_out[I2S_BUFF_SIZE];/* Pin driver handle */static PIN_Handle pinHandle;static PIN_State pinState;static ti_sysbios_family_arm_m3_Hwi_Struct hwiStruct;uint32_t mic_buffer_size = 0;int32_t mic_output = 0;/* Debug */volatile unsigned char text[100] = {"\0"};Task_Struct myTask;UART_Handle uart;///* Pin Table */PIN_Config PinTable[] ={ WCLK | PIN_INPUT_DIS | PIN_PUSHPULL | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH, BCLK | PIN_INPUT_DIS | PIN_PUSHPULL | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW , MISO | PIN_INPUT_EN | PIN_PULLDOWN, PIN_TERMINATE /* Terminate list */};Char myTaskStack[512];static void i2s_terminate(void){ HWREG(I2S0_BASE + I2S_O_AIFDMACFG) = 0; HWREG(I2S0_BASE + I2S_O_STMPCTL) = 0; HWREG(I2S0_BASE + I2S_O_IRQCLR) = 0x3F; HWREG(PRCM_BASE + PRCM_O_I2SCLKCTL) = 0; HWREG(PRCM_BASE + PRCM_O_CLKLOADCTL) = PRCM_CLKLOADCTL_LOAD; HWREG(I2S0_BASE + I2S_O_IRQMASK) = 0;}static void i2s_extract(void){ sprintf(text, "%d\r", HWREG(I2S0_BASE + I2S_O_STMPWCNT)); UART_write(uart, (const long*)text, sizeof(text));}static void i2s_ihandler(UArg arg){// I2SEnable(I2S0_BASE); I2SPointerUpdate(I2S0_BASE, true); I2SPointerUpdate(I2S0_BASE, false); i2s_extract();}void Uart_init(void){ UART_Params uartParams; /* Create a UART with data processing off. */ UART_Params_init(&uartParams); uartParams.writeDataMode = UART_DATA_BINARY; uartParams.readDataMode = UART_DATA_BINARY; uartParams.readReturnMode = UART_RETURN_FULL; uartParams.readEcho = UART_ECHO_OFF; uartParams.baudRate = 19200; uart = UART_open(Board_UART0, &uartParams); if (uart == NULL) { System_abort("Error opening the UART"); }}void i2s_init(void){ /* 1. Set up and configure required ADx and clock pins */ pinHandle = PIN_open(&pinState, PinTable); if(NULL == pinHandle) { while(1); } IOCPortConfigureSet(BCLK, IOC_PORT_MCU_I2S_BCLK, IOC_STD_OUTPUT); IOCPortConfigureSet(WCLK, IOC_PORT_MCU_I2S_WCLK, IOC_STD_OUTPUT); IOCPortConfigureSet(MISO, IOC_PORT_MCU_I2S_AD0, IOC_STD_INPUT ); /* 2. Enable I2S peripheral & configure WCLK and MCLK audio clocks */ Power_setConstraint(PowerCC26XX_SB_DISALLOW); Power_setDependency(PowerCC26XX_PERIPH_I2S); // I2S Clock Gate Gate For Run mode HWREG(PRCM_BASE + PRCM_O_I2SCLKGR) = PRCM_I2SCLKGR_CLK_EN; // I2S Clock gate for Sleep mode HWREG(PRCM_BASE + PRCM_O_I2SCLKGS) = PRCM_I2SCLKGS_CLK_EN; // I2S Clock Control (data and WCLK are sampled on the positive edge of BCLK, USER defined WCLK, CLK disabled) HWREG(PRCM_BASE + PRCM_O_I2SCLKCTL) = (PRCM_I2SCLKCTL_SMPL_ON_POSEDGE | (2 << PRCM_I2SCLKCTL_WCLK_PHASE_S)); // WCLK Division Ratio. (WCLK = MCUCLK/(BDIV*(WDIV[7:0] + WDIV[15:8]) [Hz])) = 48kHz HWREG(PRCM_BASE + PRCM_O_I2SWCLKDIV) = 0x2020; // MCLK Division Ratio. (MCLK = MCUCLK/MDIV [Hz] = 48MHz/24 = 2MHz) HWREG(PRCM_BASE + PRCM_O_I2SMCLKDIV) = 94; // Load settings from buffers to actual registers HWREG(PRCM_BASE + PRCM_O_CLKLOADCTL) = PRCM_CLKLOADCTL_LOAD; /* 3. Configure the serial audio interface format and the memory interface controller * Set the following registers: I2S:AIFWCLKSRC, I2S:AIFDIRCFG, * I2S:AIFFMTCFG, I2S:AIFWMSK0, I2S:AIFWMSK1, and I2S:AIFWMSK2. * BCLK must not be running when changing the I2S:AIFWCLKSRC register. */ I2SControlTable g_controlTable; // Define global g_pControlTable = &g_controlTable; // Assign pointer I2SClockConfigure( I2S0_BASE, I2S_INT_WCLK | // Clock source (internal) I2S_INVERT_WCLK); // Clock polarity (not inverted) I2SChannelConfigure(I2S0_BASE, I2S_MONO_MODE | // single phase chan 0 I2S_LINE_INPUT, I2S_LINE_UNUSED, // null for chan 1 I2S_LINE_UNUSED); // null for chan 2 I2SAudioFormatConfigure(I2S0_BASE, I2S_MEM_LENGTH_24 | // Sample size I2S_POS_EDGE | // Positive Clock edge sampling I2S_DUAL_PHASE_FMT | // Phase I2S_WORD_LENGTH_24, // Word length 1); I2SBufferConfig( I2S0_BASE, (uint32_t)&i2s_in, // address of input buffer (uint32_t)&i2s_out, // address of output buffer I2S_DMA_BUF_SIZE_256, // size of DMA buffer: 256 I2S_BUFF_SIZE); /* 4. Enable BCLK (set externally in the PRCM module) */ // I2S clock control HWREG(PRCM_BASE + PRCM_O_I2SCLKCTL) = (PRCM_I2SCLKCTL_SMPL_ON_POSEDGE | (2 << PRCM_I2SCLKCTL_WCLK_PHASE_S) | PRCM_I2SCLKCTL_EN); // I2S clock control (Use internally generated clock HWREG(PRCM_BASE + PRCM_O_I2SBCLKSEL) = PRCM_I2SBCLKSEL_SRC; // BCLK division ratio (BCLK = MCUCLK/BDIV[Hz] = 48MHz/16 = 3MHz) HWREG(PRCM_BASE + PRCM_O_I2SBCLKDIV) = BCLK_DIV; //Load setting from buffers to actual registers HWREG(PRCM_BASE + PRCM_O_CLKLOADCTL) = PRCM_CLKLOADCTL_LOAD; /* 5. Configure and prepare and samplestamp generator */ // Set the I2S:STMPWPER register. uint16_t tmp = I2S_BUFF_SIZE; /* This number corresponds to the total size of the sample ring buffer used by the system. Set the two registers I2S:STMPINTRIG and I2S:STMPOUTTRIG > I2S:STMPWPER to avoid false triggers before the samplestamp generator is started. */ //WCLK Counter period value HWREG(PRCM_BASE + I2S_O_STMPWPER) = tmp; //WCLK Counter trigger value for input pins HWREG(PRCM_BASE + I2S_O_STMPINTRIG) = tmp + 1; //WCLK counter trigger value for output pins HWREG(PRCM_BASE + I2S_O_STMPOUTTRIG) = tmp + 1; /* 6. Enable the samplestamp generator */ I2SSampleStampEnable(I2S0_BASE); /* 7. Enable the serial audio interface */ // Set the I2S:AIFPTRNEXT and the I2S:AIFOUTPTRNEXT registers for first memory interface buffers // Set the I2S:AIFDMACFG register; This number corresponds to the length of each block in the sample ring buffer used by the system I2SEnable(I2S0_BASE); // Set the I2S:AIFINPTRNEXT and the I2S:AIFOUTPTRNEXT registers for second memory interface buffers. I2SPointerUpdate(I2S0_BASE, true); I2SPointerUpdate(I2S0_BASE, false); Hwi_Params hwiParams; // Setup HWI Handler Hwi_Params_init(&hwiParams); Hwi_construct(&hwiStruct, INT_I2S_IRQ, i2s_ihandler, &hwiParams, NULL); // Enable DMA_IN interrupt I2SIntEnable(I2S0_BASE, I2S_INT_DMA_IN); I2SPointerUpdate(I2S0_BASE, true); I2SPointerUpdate(I2S0_BASE, false); /* 8. START INPUT AND OUTPUT AUDIO STREAMING */ // Set the I2S:STMPINTRIG and the I2S:STMPOUTTRIG registers so they correctly match the I2S:AIFINPTR and the I2S:AIFOUTPTR registers I2SSampleStampConfigure(I2S0_BASE, true, false); // Interrupt clear register I2SIntClear(I2S0_BASE, I2S_INT_DMA_IN);}static void taskFxn(UArg a0, UArg a1){ i2s_init();}int main(void){ Task_Params taskParams; /* Call board init functions. */ Board_initGeneral(); Board_initUART(); /* Initialize UART peripheral */ Uart_init(); /* Configure task. */ Task_Params_init(&taskParams); taskParams.stack = myTaskStack; taskParams.stackSize = sizeof(myTaskStack); Task_construct(&myTask, taskFxn, &taskParams, NULL); /* Start BIOS */ BIOS_start(); return (0);}
阅读全文
0 0
- CC26xx I2S
- I2S
- CC26xx PWM
- CC26XX SBL
- CC26xx SPI
- [CortexM3--CC26XX]IO Control
- [CortexM3--CC26XX]UARTs
- CC26xx &&CC13xx 多线程
- I2S标准
- I2S标准
- I2S标准
- I2S总线
- I2S协议
- I2S总线
- I2S 分析
- I2S标准
- I2S总线
- i2s协议
- Spring整合Quartz(JobDetailBean方式)
- Yarn的运行原理(执行流程)
- 经典的生产者与消费者模型(基于synchronized方法实现)
- 多线程
- HTTP请求错误400、401、402、403、404、405、406、407、412、414、500、501、502详解
- CC26xx I2S
- LabView学习
- Windows Error 0x00002620
- Spring(13)——PropertyPlaceholderConfigurer(二)之namespace
- Java工程师的一些面试总结(3)
- 手机App版本更新(强制更新/选择更新)
- 为什么我不再运营百家号了?这说出了我的心声
- SysinternalsSuite工具
- python二进制解析strut.upack的错误unpack requires a string argument of length 4