📄 vs10xx.c
字号:
/********************************************************************************************************
* 文 件 名 : VX10xx.c
* 程 序 员 : (CaiJie) hnclcj@gmail.com
* (c) Copyright 2007-2007, CaiJie
* All Rights Reserved
* 创建日期 :
* 说 明 :
* 修改日期 :
* 修改版本 :
* 说 明 :
********************************************************************************************************/
#define VS_GLOBLAS
#include "includes.h"
#if VS_MODULE_EN > 0
/********************************************************************************************************
* 本地变量
********************************************************************************************************/
static OS_EVENT *VSSem;
/********************************************************************************************************
* 本地函数
********************************************************************************************************/
static void VSUnLock (void); //
static void VSLock (void); //
static void VSByteWr (INT8U dat); // spi write a byte
static void VSCmdWr (INT8U addr, INT16U dat);// write register
static INT16U VSCmdRd (INT8U addr); // read register
static void VSInitHard (void); // 初始化硬件
static void VSSpiSet (void); // high spi clk
static void VSDataWr (INT8U dat); //
/********************************************************************************************************
* 功 能 : 高速SPI设置
* 入 口 : 无
* 返 回 : 无
* 说 明 : High speed, should not exceed 49.512MHz/6
********************************************************************************************************/
static void VSSpiSet(void)
{
Spi1Init(0x08);//0x08
}
/********************************************************************************************************
* 功 能 : 写1字节到VS10XX
* 入 口 : 'dat' 待写入的数据
* 返 回 : 无
* 说 明 : 无
********************************************************************************************************/
static void VSByteWr (INT8U dat)
{
Spi1SendByte(dat);
}
/********************************************************************************************************
* 功 能 : 读1字节从VS100XX
* 入 口 : 无
* 返 回 : 无
* 说 明 : 无
********************************************************************************************************/
INT8U VSByteRd (void)
{
return Spi1RevByte();
}
/********************************************************************************************************
* 功 能 : 写寄存器
* 入 口 : 无
* 返 回 : 无
* 说 明 : 无 参数,地址和数据 config register
********************************************************************************************************/
static void VSCmdWr (INT8U addr, INT16U dat)
{
VS_XCS_LOW(); // XCS 设置为低 选择命令寄存器
VSByteWr(VS_OPCODE_WRITE); // 写操作
VSByteWr(addr); // 写地址
VSByteWr((INT8U)(dat >> 8)); // 数据高
VSByteWr((INT8U)(dat >> 0)); // 数据低
VS_XCS_HIGH(); // XCS 设置为高(释放)
}
/********************************************************************************************************
* 功 能 : 读寄存器
* 入 口 : 'addr' 地址
* 返 回 : 返回register内容
* 说 明 : 无
********************************************************************************************************/
static INT16U VSCmdRd (INT8U addr)
{
INT16U temp; //
VS_XCS_LOW(); // 选择命令寄存器
VSByteWr(VS_OPCODE_READ); // 读操作
VSByteWr(addr); // 写地址
temp = (INT16U)(VSByteRd() << 8); // 读高字节
temp |= (INT16U)(VSByteRd() << 0); // 读低字节
VS_XCS_HIGH(); // 释放命令寄存器
return temp; // 返回读到的结果
}
/********************************************************************************************************
* 功 能 : 设置VS起始的解码时间
* 入 口 : 无
* 返 回 : 无
* 说 明 : 1> VS 实际上16BIT 变量来保存解码时间 最大解码时间18小时12分15秒 后翻转
********************************************************************************************************/
void VSDecTimeSet (INT8U hour, INT8U min, INT8U sec)
{
INT32U time;
VSLock(); //
time = hour * 3600 + min * 60 + sec; // 先计算时间 换算为秒
time = time > 0xffff ? 0xffff : time; // 数据有效范围处理
VSCmdWr(VS_DECODE_TIME_REG, time); // 写数据
VSUnLock(); //
}
/********************************************************************************************************
* 功 能 : 填充2048个0到VS10XX
* 入 口 : 无
* 返 回 : 无
* 说 明 : fill 2048 zero
********************************************************************************************************/
void VSFillZero (void)
{
INT16U i;
VSLock(); //
for(i=0; i<2048; i++) {
while(!VSDataReqCheck());
VSDataWr(0x00);
}
VSUnLock(); //
}
/********************************************************************************************************
* 功 能 : Write 32bytes data
* 入 口 : 无
* 返 回 : 无
* 说 明 : 无
********************************************************************************************************/
void VSBufWr(INT8U *buf)
{
INT8U n = 32;
VS_XDCS_LOW();
while(n--) {
VSByteWr(*buf++);
}
VS_XDCS_HIGH();
}
/********************************************************************************************************
* 功 能 : VS10XX芯片初始化
* 入 口 : 无
* 返 回 : 0 初始化失败
* 1 初始化OK
* 说 明 : 无
********************************************************************************************************/
BOOL VSInit (void)
{
VSSem = OSSemCreate(1); // SPI控制口线
VSInitHard(); // 初始化基本硬件
while(!VSDataReqCheck()); // 等待VS空闲
VSCmdWr(VS_MODE_REG, 0x0805); // 软件复位 0804
DelayNMs(10); // 延时1ms
while(!VSDataReqCheck()); // 等待VS空闲
VSCmdWr(VS_CLOCKF_REG, 0xe000); // 设置vs1003的时钟,3倍频(9800)
VSCmdWr(VS_AUDATA_REG, 0xBB81); // 采样率48k,立体声
VSCmdWr(VS_BASS_REG, 0x0055); // 设置重音
VSCmdWr(VS_VOL_REG, 0x0000); // 关闭音量
DelayNMs(10); // 延时1ms
return 1; // 默认返回成功
}
/********************************************************************************************************
* 功 能 : VS10XX基本硬件初始化
* 入 口 : 无
* 返 回 : 无
* 说 明 : 无
********************************************************************************************************/
static void VSInitHard (void)
{
SETBIT(VS_RST_DDR, VS_RST); // RST 输出
SETBIT(VS_XCS_DDR, VS_XCS); // XCS 输出
SETBIT(VS_XDCS_DDR, VS_XDCS); // XDCS 输出
CLRBIT(VS_DREQ_DDR, VS_DREQ); // DREQ 输入
DelayNMs(3); //
VS_DREQ_HIGH(); // DREQ 端口为高
VS_XCS_HIGH(); // XCS 端口为高 释放命令寄存器
VS_XDCS_LOW(); // XDCS 端口为低 释放数据寄存器 高电平期间为数据发送
DelayNMs(100); // 延时40MS复位VS
VS_RST_LOW(); // RST LOW 开始复位 VS10XX 硬件复位
DelayNMs(100); // 延时40MS复位VS
VS_RST_HIGH(); // RST HIGH 完成复位
VSSpiSet(); // 设置SPI1VS数据接口
DelayNMs(100); // 延时保证VS10XX芯片稳定
}
/********************************************************************************************************
* 功 能 : VS10XX软复位
* 入 口 : 无
* 返 回 : 无
* 说 明 : 无
********************************************************************************************************/
void VSSoftRst()
{
VSLock(); //
VSCmdWr(VS_MODE_REG, 0x0804); // reset
VSUnLock(); //
DelayNMs(10); //
}
/********************************************************************************************************
* 功 能 : 读VS解码时间数据
* 入 口 : 无
* 返 回 : 解码后的时间 单位s
* 说 明 : 无
********************************************************************************************************/
INT16U VSDecTimeRd (void)
{
INT16U time; //
VSLock(); //
time = VSCmdRd(VS_DECODE_TIME_REG); //
VSUnLock(); //
return time; //
}
/********************************************************************************************************
* 功 能 : 检查VS10XX是否需要数据
* 入 口 : 无
* 返 回 : 1 需要写数据
* 0 不需要写数据
* 2 OS中等待超时
* 说 明 : 1> 这里是采用软件查询方式
* 2> 可以采用中断方式来处理数据请求
* 3> 这里默认是5S等待超时OS环境下 前后台模式需要去掉OS相关 并在后台处理芯片可能锁死问题
********************************************************************************************************/
BOOL VSDataReqCheck (void)
{
BOOL req; //
INT32U pin;
pin = VS_DREQ_PIN; // 读VSDEQ引脚状态
req = GETBIT(pin, VS_DREQ); // 只需要DREQ状态
return req; // 返回状态
}
/********************************************************************************************************
* 功 能 : 写1字节数据
* 入 口 : ‘dat’ 待写入的数据
* 返 回 : 无
* 说 明 : 无
********************************************************************************************************/
static void VSDataWr (INT8U dat)
{
VS_XDCS_LOW(); // XDCS 设置为高
VSByteWr(dat); // 写入数据
VS_XDCS_HIGH(); // XDCS 设置为低(释放)
}
/********************************************************************************************************
* 功 能 : 写N数据到MP3
* 入 口 : ‘pDatBuf’ 待写入的数据
* 返 回 : 无
* 说 明 : 1> 当DREQ查询到可以写入数据的时候 是允许一次写入32字节数据
********************************************************************************************************/
void VSDataNWr (INT8U *pDatBuf, INT8U len)
{
INT16U i;
VSLock(); //
for(i=0; i<len; i++) { // 根据手册 不忙最跺允许写32字节数据
VSDataWr(*pDatBuf++); // 写入音频数据
}
VSUnLock(); //
}
/********************************************************************************************************
* 功 能 :
* 入 口 : 无
* 返 回 : 无
* 说 明 : 无
********************************************************************************************************/
void VSSetVol (INT8U lvol, INT8U rvol)
{
VSLock(); //
VSCmdWr(VS_VOL_REG, ~(((INT16U)lvol<<8) | (INT16U)rvol));//
VSUnLock(); //
}
/********************************************************************************************************
* 功 能 :
* 入 口 : 无
* 返 回 : 无
* 说 明 : 无
********************************************************************************************************/
static void VSLock (void)
{
INT8U err;
OSSemPend(VSSem, 0, &err);
}
/********************************************************************************************************
* 功 能 :
* 入 口 : 无
* 返 回 : 无
* 说 明 : 无
********************************************************************************************************/
static void VSUnLock (void)
{
OSSemPost(VSSem);
}
#endif
/********************************************************************************************************
* End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -