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

📄 ssb_13s.c

📁 HSAV OTG13S USB-HOST MP3模块应用源代码
💻 C
字号:
#include "F45_main.h"           


void MSSB_Initialize(){                             // 上电初始化
    pSSB_SCK = 1;                                   // 初始化 SCK 脚          
    pSSB_SIN = 1;                                   // 初始化 SIN 脚                 
    pSSB_SDD = 1;                                   // 初始化 SDD 脚               

    MSSB_Write(0x04, 0x007f);                       // 中断控制设置, 0x007f = 允许所有中断
    //  D0.= 盘插入中断设置,         D1 = U盘拨掉中断设置
    //  D2 = 曲目播放完中断设置      D3 = 时间变化中断设置
    //  D4 = 曲目变化中断设置        D5 = 曲目总时间变化中断设置
    //  D6 = 歌名变化中断设置
    return;
}


void MSSB_Polling(){
    BYTE gLocal_1;

    if (!pSSB_SIN && MSSB_Read(0x08)){
//           |            |_______________ 读取寄存器 0x08 内容, 处理相应中断
//           |                            
//           |____________________________ SIN 被拉低 有中断产生

        gLocal_1 = g2SSB_ReceiveBuffer[0] & 0xff;
        if (gLocal_1 & 0x01){                       // 发现有U盘插入, 如果不须知道有U盘插入,可以设置寄存器 0x04 第0位为 0;反之为 1
            MSSB_Write(0x05, 0x0001);               // 屏蔽其中断
            MSSB_USB_Insert();                      // 显示有U盘插入
        }
        if (gLocal_1 & 0x02){         //发现U盘拨掉, 如果不须知道U盘拨掉,可以设置寄存器 0x04 第 1 位为 0;反之为 1
            MSSB_Write(0x05, 0x0002); //屏蔽其中断
            MSSB_USB_Remove();        //显示U盘拨掉
        }
        if (gLocal_1 & 0x04){         //曲目播放完,如果不须知道曲目播放完,可以设置寄存器 0x04 第 2 位为 0;反之为 1
            MSSB_Write(0x05, 0x0004); //屏蔽其中断
            MSSB_TrackEnd();          //显示曲目播放完
        }
        if (gLocal_1 & 0x08){         //播放时间变化.如果不须知道时间变化, 可以设置寄存器 0x04 第 3 位为 0;反之为 1
            MSSB_Read(0x0c);          //读播放时间.
            MSSB_TrackTimer();        //显示播放时间
        }
        if (gLocal_1 & 0x10){         //播放曲目变化.如果不须知道曲目变化, 可以设置寄存器 0x04 第 4 位为 0;反之为 1
            MSSB_Read(0x0b);          //读曲目
            MSSB_TrackNumber();       //显示曲目
        }
        if (gLocal_1 & 0x20){         //曲目总时间变化  如果不须要总时间, 可以设置寄存器 0x04 第 5 位为 0;反之为 1
            MSSB_Read(0x0d);          //读总时间
        }
        if (gLocal_1 & 0x40){         //歌名变化   如果不须要歌名, 可以设置寄存器 0x04 第 6 位为 0;反之为 1
            if(MSSB_Read(0x0f)){      //读歌名
                MSSB_TrackName();     //显示歌名
            }          
        }
    }
    return;
}




                            
                            
void MSSB_ModeWrite(BYTE gLocal_1, BYTE gLocal_2){
    do {
        FSSBit_Store = gLocal_2 & 0x01;  //
        pSSB_SDD = FSSBit_Store;         // 发送一位数据
        MSSB_SCK(0);                     // pSSB_SCK 脚变低 发送数据
        gLocal_2 >>= 1;                  // 将发送下一位数据
        MSSB_SCK(1);                     // pSSB_SCK 脚变高 准备发送下一位数据
    } while (--gLocal_1 > 0);
    return;
}

WORD MSSB_ModeRead(){
    BYTE gLocal_1; 
    WORD g2Local_1; 
    
    gLocal_1 = 0;
    do {
        MSSB_SCK(0);                       // pSSB_SCK 脚变低 接收数据
        g2Local_1 >>= 1;                   // 接收一位数据
        MSSB_SCK(1);                       // SCK 脚变高 准备接收下一位数据
        FSSBit_Store = pSSB_SDD;          
        if (FSSBit_Store) g2Local_1 |= 0x8000;  // 接收到数据
    } while (++gLocal_1 < 16);                 //每次接收 2 个字节
    return g2Local_1;                      
}


BOOL MSSB_Write(BYTE gLocal_1, WORD g2Local_1){
    BYTE gLocal_2;      // |           |______________2个字节数据
    BOOL FLocal_1;       //|____________________地址 要 < 0x08

    FLocal_1 = 0;
    gLocal_2 = 3;                             // 如果发送错误 重发
    do {
        pSSB_SIN = 0;                         // SIN 脚变低 准备发送寄存器的地址
        MSSB_ModeWrite(4,gLocal_1);           // 发送 4 位寄存器的地址
        pSSB_SIN = 1;                         // SIN 脚变高 准备发送寄存器的数据
        MSSB_ModeWrite(8, g2Local_1 & 0xff);  // 发送低 8 位数据
        MSSB_ModeWrite(8, g2Local_1 >> 8);    // 发送高 8 位数据
        pSSB_SDD = 1;                         // 发送完毕 SDD 脚变高 准备接收应答信号
        MSSB_SCK(0);                          // OTG13S 发出应答信号
        MSSB_SCK(1);                       
        if (pSSB_SDD != FSSBit_Store){        // SDD 不等于 FSSBit_Store ,发送正确
            FLocal_1 = 1;                          
            MSSB_SCK(0);                        
            MSSB_SCK(1);                   
            break;                            // Exit 
        }
    } while(--gLocal_2 > 0);                 
    return FLocal_1;
}


BOOL MSSB_Read(BYTE gLocal_1){
    BYTE gLocal_2;     //|_________ 地址 要 > 0x07
    BOOL FLocal_1;
    WORD g2Local_1;
    
    FLocal_1 = 0;
    gLocal_2 = 3;
    do {
        pSSB_SIN = 0;                     // SIN 脚变低 准备发送寄存器的地址
        MSSB_ModeWrite(4, gLocal_1);      // 发送 4 位寄存器的地址
        pSSB_SDD = 1;                     // 准备接收数据
        pSSB_SIN = 1;                     // SIN 脚变高 准备接收据
    
        if (gLocal_1 == 0x0f){            //读歌名
            gLocal_1 = 0;
            while (1) {
                g2Local_1 = MSSB_ModeRead(); 
                g2SSB_ReceiveBuffer[gLocal_1] = g2Local_1;
                if ((g2Local_1 == 0) || (++gLocal_1 > 15)) break;
                    // gLocal_1 歌名长度大于 15 退出
                    // g2Local_1 是 0 退出
            };
        }
        else {
            g2SSB_ReceiveBuffer[0] = MSSB_ModeRead();   // 接收到 16 位数据
        }
        pSSB_SDD = 1;                                   // 接收完毕 SDD 脚变高 准备接收应答信号     
        MSSB_SCK(0);                                    // OTG13S 发出应答信号
        MSSB_SCK(1);             
        if (pSSB_SDD != FSSBit_Store){                  // SDD 不等于 FSSBit_Store,接收正确
            FLocal_1 = 1;                               // 正确
            MSSB_SCK(0);                        
            MSSB_SCK(1);                       
            break;            
        }                        
    } while(--gLocal_2 > 0);
    return FLocal_1;              

}

void MSSB_SCK(BOOL FLocal_1){
    BYTE gLocal_1;

    pSSB_SCK = FLocal_1;      
    gLocal_1 = cSSB_Delay15us;      // 延时15us
    while (--gLocal_1 > 0);
    return;
}





void MSSB_ReadFileInfo(){
    BYTE gLocal_1;
    BYTE gLocal_2;
    BYTE gLocal_3;

    if (MSSB_Read(0x0d)){ //读文件的码流,采样频率,类型
        gLocal_1 = g2SSB_ReceiveBuffer[0] & 0x7f; //文件的码流率
        gLocal_2 = g2SSB_ReceiveBuffer[0] >> 7;   //采样频率
        gLocal_3 = g2SSB_ReceiveBuffer[0] >> 14;  //文件的类型
    } 
    return;
}  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -