查看: 2076|回复: 1

[原创] 【LPC54114双核任务四】LPC54114音频库的外设初始化

[复制链接]
  • TA的每日心情
    郁闷
    2022-4-4 11:28
  • 签到天数: 351 天

    [LV.8]以坛为家I

    141

    主题

    8054

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5740
    最后登录
    2022-4-4
    发表于 2017-7-18 21:55:34 | 显示全部楼层 |阅读模式
    本帖最后由 wambob 于 2017-7-18 21:58 编辑

           前面学习了线程的启动。用户应用代码在
    1.         rt_application_init();
    复制代码
    中初始化,这个是用户线程的入口点。
    lpc54114在入口创建了一个线程tid,线程名“init”,入口点rt_init_thread_entry,参数0,栈大小2048,最大优先级32/3,线程时间片20。
    1. int rt_application_init()
    2. {
    3.     rt_thread_t tid;

    4.     tid = rt_thread_create("init", rt_init_thread_entry, RT_NULL, 2048, RT_THREAD_PRIORITY_MAX/3, 20);
    5.     if (tid != RT_NULL)
    6.         rt_thread_startup(tid);
    7.                
    8.     return 0;
    9. }
    复制代码
    来看看线程tid做了什么
    1. void rt_init_thread_entry(void* parameter)
    2. {
    3.           rt_thread_delay(2);
    4.          
    5. //          msd_init("sd0", "spi10");
    6. //        
    7. //    /* Filesystem Initialization */
    8. //#if defined(RT_USING_DFS) && defined(RT_USING_DFS_ELMFAT)
    9. //          /* initialize the device file system */
    10. //          dfs_init();

    11. //          /* initialize the elm chan FatFS file system*/
    12. //          elm_init();
    13. //   
    14. //    /* mount sd card fat partition 1 as root directory */
    15. //    if (dfs_mount("sd0", "/", "elm", 0, 0) == 0) {
    16. //        rt_kprintf("File System initialized!\n");
    17. //    }
    18. //    else {
    19. //        rt_kprintf("File System initialzation failed!\n");
    20. //    }
    21. //#endif /* RT_USING_DFS && RT_USING_DFS_ELMFAT */

    22. #ifdef RT_USING_I2C
    23.     rt_i2c_core_init();
    24.     rt_hw_i2c_init();
    25. #endif

    26.     codec_hw_init("i2c1");
    27.                
    28.         /* initialization finsh shell Component */
    29.     finsh_system_init();

    30.                 demo_init();
    31. }
    复制代码
    注释掉的是SD卡初始化和文件系统初始化,接着条件编译,因为rtconfig.h头文件中定义了,所以是I2C的初始化,这个音频库和活动的板子不配套,所以需要修改外设管脚。
    1. void rt_hw_i2c_init(void)
    2. {
    3.     rt_kprintf("install i2c1 \r\n");
    4. #ifdef RT_USING_I2C_BITOPS               
    5.     Chip_IOCON_PinMuxSet(LPC_IOCON, I2C_SDA_PORT, I2C_SDA_PIN, IOCON_FUNC0 | IOCON_DIGITAL_EN | IOCON_MODE_PULLUP);
    6.     Chip_IOCON_PinMuxSet(LPC_IOCON, I2C_SCL_PORT, I2C_SCL_PIN, IOCON_FUNC0 | IOCON_DIGITAL_EN | IOCON_MODE_PULLUP);
    7.         
    8.                 Chip_GPIO_SetPinDIROutput(LPC_GPIO, I2C_SDA_PORT, I2C_SDA_PIN);
    9.                 Chip_GPIO_SetPinState(LPC_GPIO, I2C_SDA_PORT, I2C_SDA_PIN, 1UL);

    10.                 Chip_GPIO_SetPinDIROutput(LPC_GPIO, I2C_SCL_PORT, I2C_SCL_PIN);
    11.                 Chip_GPIO_SetPinState(LPC_GPIO, I2C_SCL_PORT, I2C_SCL_PIN, 1UL);
    12.         

    13.     rt_memset((void *)&i2c_device, 0, sizeof(struct rt_i2c_bus_device));
    14.     i2c_device.priv = (void *)&bit_ops;
    15.     rt_i2c_bit_add_bus(&i2c_device, "i2c1");

    16. #else
    17. //    Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 25, IOCON_FUNC1 | IOCON_DIGITAL_EN | IOCON_FASTI2C_EN);
    18. //    Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 26, IOCON_FUNC1 | IOCON_DIGITAL_EN | IOCON_FASTI2C_EN);
    19.          
    20.         Chip_IOCON_PinMuxSet(LPC_IOCON, 1,  1, IOCON_FUNC5 | IOCON_DIGITAL_EN | IOCON_FASTI2C_EN);        
    21.   Chip_IOCON_PinMuxSet(LPC_IOCON, 1,  2, IOCON_FUNC5 | IOCON_DIGITAL_EN | IOCON_FASTI2C_EN);
    22.                
    23.                 Chip_I2C_Init(LPC_I2C0);
    24.                 Chip_I2C_SetClockDiv(LPC_I2C0, 20);
    25.                 Chip_I2CM_SetBusSpeed(LPC_I2C0, 100000);
    26.                 Chip_I2CM_Enable(LPC_I2C0);
    27.                
    28.     rt_memset((void *)&lpc54110_i2c1, 0, sizeof(struct rt_i2c_bus_device));
    29.     lpc54110_i2c1.ops = &i2c1_ops;

    30.     rt_i2c_bus_device_register(&lpc54110_i2c1, "i2c1");

    31. #endif
    32. }
    复制代码
    原来I2C用的管脚是0端口25、26脚,活动的板子是1端口1、2脚。
    接着下面是解码器的使用i2c1这个设备进行
    初始化。
    1. rt_err_t codec_hw_init(const char * i2c_bus_device_name)
    2. {
    3.     struct rt_i2c_bus_device * i2c_device;
    4.                 uint32_t ret;
    5.         
    6.                 Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 21, (IOCON_FUNC1 | IOCON_MODE_INACT | IOCON_DIGITAL_EN));
    7.                 Chip_Clock_SetCLKOUTSource(SYSCON_CLKOUTSRC_MAINCLK, 1);
    8.                  
    9.                 rt_kprintf("read file page\r\n");               
    10.                 ret = Chip_Clock_GetMainClockRate();
    11.                 rt_kprintf("MainClk %d  ", ret);
    12.                 ret = Chip_Clock_GetSystemClockRate();
    13.                 rt_kprintf("SysClk %d  \r\n", ret);
    14.         
    15.                 rt_kprintf("codec_hw_init_begin\r\n");
    16.     i2c_device = rt_i2c_bus_device_find(i2c_bus_device_name);
    17.     if(i2c_device == RT_NULL)
    18.     {
    19.         rt_kprintf("i2c bus device %s not found!\r\n", i2c_bus_device_name);
    20.         return -RT_ENOSYS;
    21.     }
    22.     codec.i2c_device = i2c_device;
    23.                                 
    24.                 /* Stop auto trimming of the FRO from USB */
    25.                 //Chip_USB_TrimOff(0);
    26. #if Magicoe
    27.                 LPC_SYSCON->FROCTRL = LPC_SYSCON->FROCTRL & ~(SYSCON_FROCTRL_MASK | SYSCON_FROCTRL_USBCLKADJ);               
    28.                 Chip_Clock_SetMainClockSource(SYSCON_MAINCLKSRC_FRO12MHZ);
    29.                 Chip_Clock_SetSystemPLLSource(SYSCON_PLLCLKSRC_FRO12MHZ);
    30.                 Chip_Clock_SetPLLFreq(&pll_setup_48KHz);
    31.                 //Chip_Clock_SetPLLFreq(&pllSetup);
    32.                 Chip_Clock_SetMainClockSource(SYSCON_MAINCLKSRC_PLLOUT);
    33.                
    34.                 Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 17, (IOCON_FUNC4 | IOCON_MODE_INACT | IOCON_DIGITAL_EN));
    35.                 Chip_Clock_SetMCLKDirOutput();
    36.                 Chip_Clock_SetMCLKClockSource(SYSCON_MCLKSRC_PLL, 2);
    37.                
    38.                 Chip_SYSCON_SetFLASHAccess(SYSCON_FLASH_3CYCLE);
    39. #else
    40.                 Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 17, (IOCON_FUNC4 | IOCON_MODE_INACT | IOCON_DIGITAL_EN));
    41.                 Chip_Clock_SetMCLKDirOutput();
    42.                 Chip_Clock_SetMCLKClockSource(SYSCON_MCLKSRC_PLL, (1*LPC54110_IIS_MUL));
    43. #endif

    44.                 rt_kprintf("read file page\r\n");               
    45.                 ret = Chip_Clock_GetMainClockRate();
    46.                 rt_kprintf("MainClk %d  ", ret);
    47.                 ret = Chip_Clock_GetSystemClockRate();
    48.                 rt_kprintf("SysClk %d  \r\n", ret);
    49. // Initial I2C here maybe
    50.                
    51.                 Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 5, IOCON_FUNC1 | IOCON_DIGITAL_EN);                                                //        Flexcomm 6 / SDA
    52.                 Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 6, IOCON_FUNC1 | IOCON_DIGITAL_EN);                                                //        Flexcomm 6 / WS
    53.                 Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 7, IOCON_FUNC1 | IOCON_DIGITAL_EN);                                                //        Flexcomm 6 / SCK

    54. //                Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 6, IOCON_FUNC2 | IOCON_DIGITAL_EN);                                                //        Flexcomm 7 / SCK
    55. //                Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 7, IOCON_FUNC2 | IOCON_DIGITAL_EN);                                                //        Flexcomm 7 / SDA
    56. //                Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 8, IOCON_FUNC2 | IOCON_DIGITAL_EN);                                                //        Flexcomm 7 / WS
    57.                
    58.                 Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 12, IOCON_FUNC4 | IOCON_DIGITAL_EN); /* Flexcomm 7 / SCK */
    59.         Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 13, IOCON_FUNC4 | IOCON_DIGITAL_EN);  /* Flexcomm 7 / SDA */
    60.         Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 14, IOCON_FUNC4 | IOCON_DIGITAL_EN);  /* Flexcomm 7 / WS */
    61.                
    62.                 Chip_I2S_Init(I2S_PORT_TX, &audio_fmt_tx);                                                                                                                                                                //        initialize I2S port
    63.                
    64.                 Chip_Clock_SetFLEXCOMMClockSource(I2S7_FLEXCOMM, SYSCON_FLEXCOMMCLKSELSRC_PLL);
    65.                 Chip_I2S_Config(I2S_PORT_TX, &audio_fmt_tx);                                                                                                                                                        //        configure I2S port

    66.                 Chip_I2S_FIFO_Config (I2S_PORT_TX, &audio_fmt_tx);                                                                                                                                //        configure I2S FIFO
    67.                 Chip_I2S_FIFO_Control(I2S_PORT_TX, &audio_fmt_tx, I2S_FIFO_TXZ_ENABLE);                                                //        send zeros if no data is available
    68.                 Chip_I2S_FIFO_Control(I2S_PORT_TX, &audio_fmt_tx, I2S_FIFO_ENABLE);                                                                //        enable FIFO        
    69.                
    70. //                Chip_I2S_Init(I2S_PORT_RX, &audio_fmt_rx);                                                                                                                                                                //        initialize I2S port
    71. //                Chip_Clock_SetFLEXCOMMClockSource(I2S6_FLEXCOMM, SYSCON_FLEXCOMMCLKSELSRC_PLL);
    72. //                Chip_I2S_Config(I2S_PORT_RX, &audio_fmt_rx);                                                                                                                                                        //        configure I2S port

    73. //                Chip_I2S_FIFO_Config(I2S_PORT_RX, &audio_fmt_rx);                                                                                                                                        //        configure I2S FIFO
    74. //                Chip_I2S_FIFO_Control(I2S_PORT_RX, &audio_fmt_rx, I2S_FIFO_ENABLE);                                                                //        enable FIFO
    75.                
    76.                 Chip_I2S_FIFO_SetInterrupt(I2S_PORT_TX, I2S_FIFO_INT_TXERR | I2S_FIFO_INT_TXLVL);        //        enable tx interrupts
    77. //                Chip_I2S_FIFO_SetInterrupt(I2S_PORT_RX, I2S_FIFO_INT_RXERR | I2S_FIFO_INT_RXLVL);        //        enable rx interrupts
    78.                
    79.                 /* init codec */
    80.                 ret = wm8904_init();
    81.                 if (ret == LPC_OK) {
    82.                         //g_codec.cur_rate = DEF_SAMPLE_RATE;
    83.                         /* suspend codec after init to conserve power */
    84.                         //Codec_Suspend();
    85.                 }
    86.         
    87.     codec.parent.type = RT_Device_Class_Sound;
    88.     codec.parent.rx_indicate = RT_NULL;
    89.     codec.parent.tx_complete = RT_NULL;
    90.     codec.parent.user_data   = RT_NULL;

    91.     codec.parent.control = codec_control;
    92.     codec.parent.init    = codec_init;
    93.     codec.parent.open    = codec_open;
    94.     codec.parent.close   = codec_close;
    95.     codec.parent.read    = RT_NULL;
    96.     codec.parent.write   = codec_write;

    97.     /* set read_index and put index to 0 */
    98.     codec.read_index = 0;
    99.     codec.put_index = 0;
    100. //                NVIC_EnableIRQ(I2S_TX_IRQNUM);        //        enable tx interrupt
    101. //                Chip_I2S_Start(I2S_PORT_TX);                //        start tx I2S port

    102. //                NVIC_EnableIRQ(I2S_RX_IRQNUM);        //        enable rx interrupt
    103. //                Chip_I2S_Start(I2S_PORT_RX);                //        start rx I2S port
    104.     /* register the device */
    105.     return rt_device_register(&codec.parent, "snd", RT_DEVICE_FLAG_WRONLY | RT_DEVICE_FLAG_DMA_TX);
    106. }
    复制代码
    代码有点乱,一点点理解吧,需要修改是灵活通讯串口 7,需要对照自己的板子修改。
    接着是

    RT-Thread的命令行外壳(shell) 组件的初始化。
    最后是一个demo,前面已经学习了,在里面让两个闪烁。
    编译下载到板上,打开串口输出。
    1.jpg 2.jpg
    根据串口打印的信息是读写wm8904寄存器值信息,大家可以追溯到函数里看看什么意思。
    文件系统和SD卡初始化待续...


    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    该用户从未签到

    10

    主题

    40

    帖子

    0

    注册会员

    Rank: 2

    积分
    96
    最后登录
    2018-5-11
    发表于 2017-7-20 15:03:25 | 显示全部楼层
    好多代码呀,看看学习下!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-5-7 09:31 , Processed in 0.122988 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表