📄 ssb_13s.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 + -