?? 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); // 中斷控制設(shè)置, 0x007f = 允許所有中斷
// D0.= 盤插入中斷設(shè)置, D1 = U盤撥掉中斷設(shè)置
// D2 = 曲目播放完中斷設(shè)置 D3 = 時(shí)間變化中斷設(shè)置
// D4 = 曲目變化中斷設(shè)置 D5 = 曲目總時(shí)間變化中斷設(shè)置
// D6 = 歌名變化中斷設(shè)置
return;
}
void MSSB_Polling(){
BYTE gLocal_1;
if (!pSSB_SIN && MSSB_Read(0x08)){
// | |_______________ 讀取寄存器 0x08 內(nèi)容, 處理相應(yīng)中斷
// |
// |____________________________ SIN 被拉低 有中斷產(chǎn)生
gLocal_1 = g2SSB_ReceiveBuffer[0] & 0xff;
if (gLocal_1 & 0x01){ // 發(fā)現(xiàn)有U盤插入, 如果不須知道有U盤插入,可以設(shè)置寄存器 0x04 第0位為 0;反之為 1
MSSB_Write(0x05, 0x0001); // 屏蔽其中斷
MSSB_USB_Insert(); // 顯示有U盤插入
}
if (gLocal_1 & 0x02){ //發(fā)現(xiàn)U盤撥掉, 如果不須知道U盤撥掉,可以設(shè)置寄存器 0x04 第 1 位為 0;反之為 1
MSSB_Write(0x05, 0x0002); //屏蔽其中斷
MSSB_USB_Remove(); //顯示U盤撥掉
}
if (gLocal_1 & 0x04){ //曲目播放完,如果不須知道曲目播放完,可以設(shè)置寄存器 0x04 第 2 位為 0;反之為 1
MSSB_Write(0x05, 0x0004); //屏蔽其中斷
MSSB_TrackEnd(); //顯示曲目播放完
}
if (gLocal_1 & 0x08){ //播放時(shí)間變化.如果不須知道時(shí)間變化, 可以設(shè)置寄存器 0x04 第 3 位為 0;反之為 1
MSSB_Read(0x0c); //讀播放時(shí)間.
MSSB_TrackTimer(); //顯示播放時(shí)間
}
if (gLocal_1 & 0x10){ //播放曲目變化.如果不須知道曲目變化, 可以設(shè)置寄存器 0x04 第 4 位為 0;反之為 1
MSSB_Read(0x0b); //讀曲目
MSSB_TrackNumber(); //顯示曲目
}
if (gLocal_1 & 0x20){ //曲目總時(shí)間變化 如果不須要總時(shí)間, 可以設(shè)置寄存器 0x04 第 5 位為 0;反之為 1
MSSB_Read(0x0d); //讀總時(shí)間
}
if (gLocal_1 & 0x40){ //歌名變化 如果不須要歌名, 可以設(shè)置寄存器 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; // 發(fā)送一位數(shù)據(jù)
MSSB_SCK(0); // pSSB_SCK 腳變低 發(fā)送數(shù)據(jù)
gLocal_2 >>= 1; // 將發(fā)送下一位數(shù)據(jù)
MSSB_SCK(1); // pSSB_SCK 腳變高 準(zhǔn)備發(fā)送下一位數(shù)據(jù)
} while (--gLocal_1 > 0);
return;
}
WORD MSSB_ModeRead(){
BYTE gLocal_1;
WORD g2Local_1;
gLocal_1 = 0;
do {
MSSB_SCK(0); // pSSB_SCK 腳變低 接收數(shù)據(jù)
g2Local_1 >>= 1; // 接收一位數(shù)據(jù)
MSSB_SCK(1); // SCK 腳變高 準(zhǔn)備接收下一位數(shù)據(jù)
FSSBit_Store = pSSB_SDD;
if (FSSBit_Store) g2Local_1 |= 0x8000; // 接收到數(shù)據(jù)
} while (++gLocal_1 < 16); //每次接收 2 個(gè)字節(jié)
return g2Local_1;
}
BOOL MSSB_Write(BYTE gLocal_1, WORD g2Local_1){
BYTE gLocal_2; // | |______________2個(gè)字節(jié)數(shù)據(jù)
BOOL FLocal_1; //|____________________地址 要 < 0x08
FLocal_1 = 0;
gLocal_2 = 3; // 如果發(fā)送錯(cuò)誤 重發(fā)
do {
pSSB_SIN = 0; // SIN 腳變低 準(zhǔn)備發(fā)送寄存器的地址
MSSB_ModeWrite(4,gLocal_1); // 發(fā)送 4 位寄存器的地址
pSSB_SIN = 1; // SIN 腳變高 準(zhǔn)備發(fā)送寄存器的數(shù)據(jù)
MSSB_ModeWrite(8, g2Local_1 & 0xff); // 發(fā)送低 8 位數(shù)據(jù)
MSSB_ModeWrite(8, g2Local_1 >> 8); // 發(fā)送高 8 位數(shù)據(jù)
pSSB_SDD = 1; // 發(fā)送完畢 SDD 腳變高 準(zhǔn)備接收應(yīng)答信號
MSSB_SCK(0); // OTG13S 發(fā)出應(yīng)答信號
MSSB_SCK(1);
if (pSSB_SDD != FSSBit_Store){ // SDD 不等于 FSSBit_Store ,發(fā)送正確
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 腳變低 準(zhǔn)備發(fā)送寄存器的地址
MSSB_ModeWrite(4, gLocal_1); // 發(fā)送 4 位寄存器的地址
pSSB_SDD = 1; // 準(zhǔn)備接收數(shù)據(jù)
pSSB_SIN = 1; // SIN 腳變高 準(zhǔn)備接收據(jù)
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 位數(shù)據(jù)
}
pSSB_SDD = 1; // 接收完畢 SDD 腳變高 準(zhǔn)備接收應(yīng)答信號
MSSB_SCK(0); // OTG13S 發(fā)出應(yīng)答信號
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; // 延時(shí)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;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -