一、主程序- 初始化SPI RAM FIFO,如果开了宏定义FAKE_SPI_BUFF,则此函数无实际作用,否则初始化HSPI口,连接SPI RAM;
- 创建wifi连接任务,将路由器的SSID和password编译在程序中;
- wifi连接任务建立读取网络音频码流的任务;
- 网络音频码流读取任务与音频服务器建立HTTP连接;
- 读取服务器返回的数据,每次最多读取64字节;
- 将读取到的数据写入SPI RAM FIFO,如果没有外部SPI RAM,就放在内部FIFO;
- 判断MAD任务是否建立,且SPI RAM FIFO中剩余的空间长度小于FIFO总尺寸的一半;
- 满足7中的条件,则建立MP3码流解码任务,将任务建立标志置位,否则不做操作;
- 判断网络音频码流读取次数是否是256的整数倍,如果是,则打印SPI RAM FIFO已填充的长度…;
- 回到第五步。
二、SPI RAM FIFO操作- 初始化Spi Ram Fifo,spiRamFifoInit()
- 读取位置记录)
- 写入位置记录)
- 填充的数据记录)
- 写入数据时剩余空间不足计数)
- 读取数据时剩余数据不足计数)
- 创建一个fifo能读的二值信号量
- 创建一个fifo能写的二值信号量
- 创建一个互斥信号量,用于对变量操作的保护
- 配置SPI RAM的硬件模块
- 返回SPI RAM测试的结果
- 写入Spi Ram Fifo,spiRamFifoWrite(char *buff, int len)
首先判断待写入的数据长度是否大于SPI一次能操作的长度,如果是,则将写入的长度改为一次性能操作的长度,分包写入; 判断需要写入的数据长度是否大于fifo当前写入位置到fifo末尾的长度,如果是,则将写入的长度改为fifo当前写入位置到fifo末尾的长度,分包写入; 获取对fifo的操作的权限; 判读fifo剩余空间是否小于待写入的长度,如果是,则将fifoOvfCnt++,归还fifo的操作权限,等待能写的信号量;否则将数据写入fifo,归还fifo的操作权限,发送能读取的信号量。 - 读取Spi Ram Fifo,spiRamFifoRead(char *buff, int len)
首先判断待读取的数据长度是否大于SPI一次能操作的长度,如果是,则将读取的长度改为一次性能操作的长度,分包读取; 判断需要读取的数据长度是否大于fifo当前读取位置到fifo末尾的长度,如果是,则将读取的长度改为fifo当前读取位置到fifo末尾的长度,分包读取; 获取对fifo的操作的权限; 判断fifo里的数据长度是否小于需要读取的长度,如果是,则将fifoUdrCnt++,归还fifo的操作权限,继续判断,如果当前fifo里的数据长度低于fifo的水位线标志,则等待一个能读取的信号量;否则从fifo中读出数据,归还fifo的操作权限,送能写入的信号量。 - 获取fifo中当前剩余的数据长度,int spiRamFifoFill()
获取fifo的操作权限; 将fifoFill赋值给返回值; 归还fifo的操作权限; 返回获取值。 - 获取fifo中当前剩余空间长度,int spiRamFifoFree()
调用spiRamFifoFill()获取当前剩余数据长度; 返回SPIRAMSIZE减去fifo当前剩余数据长度的值。
ESP8266_MP3_DECODER-master.zip |