⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vs10xx.c

📁 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 + -