#include "stdbool.h"
|
#include "mk_gpio.h"
|
#include "HIDO_TypeDef.h"
|
|
typedef unsigned short UC16;
|
typedef unsigned char UC8;
|
typedef unsigned long int UC32;
|
|
#define SPI_CS_PIN IO_PIN_8
|
#define SPI_CLK_PIN IO_PIN_13
|
#define SPI_MOSI_PIN IO_PIN_11
|
#define SPI_MISO_PIN IO_PIN_12
|
|
#define SPI_CS_H() gpio_pin_set(SPI_CS_PIN)
|
#define SPI_CS_L() gpio_pin_clr(SPI_CS_PIN)
|
#define SPI_CLK_H() gpio_pin_set(SPI_CLK_PIN)
|
#define SPI_CLK_L() gpio_pin_clr(SPI_CLK_PIN)
|
#define SPI_MOSI_H() gpio_pin_set(SPI_MOSI_PIN)
|
#define SPI_MOSI_L() gpio_pin_clr(SPI_MOSI_PIN)
|
#define SPI_MISO_IN() gpio_pin_get_val(SPI_MISO_PIN)
|
|
#define Delay_Us delay_us
|
#define HAL_Delay delay_ms
|
|
#define PACK_LEN 0x0111 //BIN»òT3ZÎļþ´óС(µ¥Î»512BYTE)
|
UC16 SEND_SUM = 0; //·¢Ë͵ÄУÑéºÍ
|
UC16 REC_SUM = 0 ; //½ÓÊÕµÄУÑéºÍ
|
UC8 DATA_SONG[512] = { 0 }; //´æ·ÅÒôƵÊý¾Ý
|
|
extern HIDO_UINT16 OTA_GetMusicPackNum(void);
|
extern HIDO_VOID OTA_GetMusicPackData(HIDO_UINT8* _pu8Data);
|
|
__attribute__((weak)) HIDO_VOID OTA_GetMusicPackData(HIDO_UINT8* _pu8Data)
|
{
|
|
}
|
|
__attribute__((weak)) HIDO_UINT16 OTA_GetMusicPackNum()
|
{
|
|
}
|
|
void Get512Byte(void) //¿Í»§×ÔÐбàдµÄº¯Êý£¬Ä¿µÄÊǽ«Òª·¢Ë͵ÄÒ»¸ö°üµÄÊý¾Ý´æ·ÅÔÚÊý×éDATA_SONGÖÐ
|
{
|
OTA_GetMusicPackData(DATA_SONG);
|
}
|
|
UC16 GetPackNum(void) //¿Í»§×ÔÐбàдµÄº¯Êý£¬Ä¿µÄÊǽ«Òª·¢Ë͵ÄÒ»¸ö°üµÄÊý¾Ý´æ·ÅÔÚÊý×éDATA_SONGÖÐ
|
{
|
return OTA_GetMusicPackNum();
|
}
|
|
/*--------------------------------------
|
;º¯ÊýÃû³Æ: SPI_WT588E_COMMAND(UC8 DDATA, UC8 Delay_Cnt)
|
;¹¦ÄÜ: ʵÏÖSPI¿ØÖÆÖ¸Áî,SPIģʽ0
|
;Èë²Î: DDATA Ϊ·¢ËÍÊý¾Ý Delay_CntΪ·¢ËÍËÙ¶È
|
;³ö²Î:
|
----------------------------------------*/
|
void SPI_WT588E_COMMAND(UC8 DDATA, UC8 Delay_Cnt)
|
{
|
UC8 S_DATA, j;
|
UC8 B_DATA;
|
S_DATA = DDATA;
|
B_DATA = S_DATA & 0X80;
|
|
for(j = 0; j < 8; j++)
|
{
|
if(B_DATA)
|
{
|
SPI_MOSI_H();
|
}
|
else
|
{
|
SPI_MOSI_L();
|
}
|
SPI_CLK_H(); //ʱÖÓÏßÀ¸ß
|
Delay_Us(Delay_Cnt);
|
SPI_CLK_L(); //ʱÖÓÏßÀµÍ
|
Delay_Us(Delay_Cnt);
|
S_DATA = S_DATA << 1;
|
B_DATA = S_DATA & 0X80;
|
}
|
}
|
|
/*--------------------------------------
|
;º¯ÊýÃû³Æ: SPI_WT588E_BYTE(UC8 Delay_Cnt)
|
;¹¦ÄÜ: ʵÏÖSPI½ÓÊÜÊý¾ÝУÑé,SPIģʽ1
|
;Èë²Î: Delay_CntΪ·¢ËÍËÙ¶È
|
;³ö²Î: R_DATAΪ½ÓÊÕµÄÊý¾Ý
|
----------------------------------------*/
|
UC8 SPI_WT588E_BYTE(UC8 Delay_Cnt)
|
{
|
UC8 R_DATA, j;
|
SPI_MOSI_L();
|
for(j = 0; j < 8; j++)
|
{
|
SPI_CLK_H(); //ʱÖÓÏßÀ¸ß
|
Delay_Us(Delay_Cnt);
|
SPI_CLK_L(); //ʱÖÓÏßÀµÍ
|
R_DATA = R_DATA << 1;
|
if(SPI_MISO_IN()) //½ÓÊÕһλÊý¾Ý
|
{
|
R_DATA = R_DATA | 0x01;
|
}
|
else
|
{
|
R_DATA = R_DATA & 0xFE;
|
}
|
Delay_Us(Delay_Cnt);
|
}
|
return R_DATA;
|
}
|
|
/*--------------------------------------
|
;º¯ÊýÃû³Æ: WT588E_PLAY(UC8 DDATA)
|
;¹¦ÄÜ: ÓïÒôоƬ²¥·ÅÖ¸Áî
|
;Èë²Î:
|
;³ö²Î:
|
----------------------------------------*/
|
void WT588E_PLAY(UC8 DDATA)
|
{
|
SPI_CLK_L();
|
SPI_CS_L();
|
HAL_Delay(5);
|
SPI_WT588E_COMMAND(0xF0, 100);
|
SPI_WT588E_COMMAND(DDATA, 100);
|
SPI_CS_H();
|
}
|
|
/*--------------------------------------
|
;º¯ÊýÃû³Æ: DATA_CHANGE_All_START
|
;¹¦ÄÜ: ÓïÒôÊý¾ÝÈ«²¿¸ü»»ÎÕÊÖÖ¸Áî
|
;Èë²Î:
|
;³ö²Î:
|
----------------------------------------*/
|
void DATA_CHANGE_All_START()
|
{
|
SPI_CLK_L();
|
SPI_CS_L();
|
HAL_Delay(5);
|
SPI_WT588E_COMMAND(0xE1, 100);
|
Delay_Us(20);
|
SPI_WT588E_COMMAND(0xFF, 100);
|
SEND_SUM = 0x01E0;
|
SPI_CS_H();
|
}
|
|
/*--------------------------------------
|
;º¯ÊýÃû³Æ: DATA_CHANGE_SINGLE_START
|
;¹¦ÄÜ: ÓïÒôÊý¾ÝÈ«²¿¸ü»»ÎÕÊÖÖ¸Áî
|
;Èë²Î:
|
;³ö²Î:
|
----------------------------------------*/
|
void DATA_CHANGE_SINGLE_START(UC8 Addr)
|
{
|
SPI_CLK_L();
|
SPI_CS_L();
|
HAL_Delay(5);
|
SPI_WT588E_COMMAND(0xE0, 100);
|
Delay_Us(20);
|
SPI_WT588E_COMMAND(Addr, 100);
|
SEND_SUM = 0xE0 + Addr;
|
SPI_CS_H();
|
}
|
|
/*--------------------------------------
|
;º¯ÊýÃû³Æ: DATA_CHANGE_End()
|
;¹¦ÄÜ: ÓïÒôÊý¾Ý¸ü»»½áÊøÖ¸Áî
|
;Èë²Î:
|
;³ö²Î:
|
----------------------------------------*/
|
void DATA_CHANGE_End()
|
{
|
SPI_CLK_L();
|
SPI_CS_L();
|
HAL_Delay(5);
|
SPI_WT588E_COMMAND(0xEF, 20);
|
SPI_CS_H();
|
}
|
|
/*--------------------------------------
|
;º¯ÊýÃû³Æ: DATA_CHANGE_PACK_START
|
;¹¦ÄÜ: ÓïÒôÊý¾Ý¸ü»»Ò»¸ö°üµÄ¿ªÊ¼Ö¸Áî
|
;Èë²Î:
|
;³ö²Î: 1: УÑé³É¹¦ 0:УÑéʧ°Ü
|
----------------------------------------*/
|
bool DATA_CHANGE_PACK_START()
|
{
|
UC16 SUM_TEMP = 0;
|
REC_SUM = 0;
|
SPI_CLK_L();
|
SPI_CS_L();
|
HAL_Delay(5);
|
SPI_WT588E_COMMAND(0xDF, 20);
|
Delay_Us(20);
|
SUM_TEMP = SPI_WT588E_BYTE(20);
|
REC_SUM = SUM_TEMP;
|
Delay_Us(20);
|
SUM_TEMP = SPI_WT588E_BYTE(20);
|
SUM_TEMP = SUM_TEMP << 8;
|
REC_SUM = REC_SUM + SUM_TEMP;
|
SPI_CS_H();
|
|
if(SEND_SUM == REC_SUM)
|
{
|
return true;
|
}
|
|
else
|
{
|
return false;
|
}
|
}
|
|
/*--------------------------------------
|
;º¯ÊýÃû³Æ: DATA_CHANGE_PACK_SEND
|
;¹¦ÄÜ: ÓïÒôÊý¾Ý·¢ËÍÒ»¸ö°ü
|
;Èë²Î: DATA_BUF binÎļþ´æ·ÅÇø
|
DATA_LEN Õâ¸ö°üµÄÊý¾Ý³¤¶È£¨ÍêÕû512BYTE£©
|
;³ö²Î: 1: УÑé³É¹¦ 0:УÑéʧ°Ü
|
----------------------------------------*/
|
void DATA_CHANGE_PACK_SEND(UC8* DATA_BUF, UC16 DATA_LEN)
|
{
|
UC16 SUM_TEMP = 0;
|
UC16 j;
|
SEND_SUM = 0;
|
SPI_CS_L();
|
|
for(j = 0; j < DATA_LEN; j++)
|
{
|
Delay_Us(20);
|
SPI_WT588E_COMMAND(*(DATA_BUF + j), 2);
|
SUM_TEMP = *(DATA_BUF + j);
|
j++;
|
Delay_Us(20);
|
SPI_WT588E_COMMAND(*(DATA_BUF + j), 2);
|
SUM_TEMP = SUM_TEMP + (*(DATA_BUF + j) << 8);
|
SEND_SUM = SEND_SUM + SUM_TEMP;
|
}
|
|
SPI_CS_H();
|
}
|
|
/*--------------------------------------
|
;º¯ÊýÃû³Æ: DATA_CHANGE_All()
|
;¹¦ÄÜ: ÓïÒôÊý¾ÝÈ«²¿¸ü»»
|
;Èë²Î:
|
;³ö²Î: 1: ¸ü»»³É¹¦ 0:¸ü»»Ê§°Ü
|
----------------------------------------*/
|
bool DATA_CHANGE()
|
{
|
UC16 i = 0;
|
DATA_CHANGE_All_START();
|
HAL_Delay(30);
|
|
for(i = 0; i < GetPackNum(); i++)
|
{
|
HAL_Delay(25);
|
Get512Byte();
|
if(DATA_CHANGE_PACK_START() == 1)
|
{
|
HAL_Delay(1);
|
DATA_CHANGE_PACK_SEND(DATA_SONG, 512);
|
}
|
|
else
|
{
|
printf("voice update fail");
|
return false;
|
}
|
}
|
|
DATA_CHANGE_End();
|
HAL_Delay(100);
|
printf("voice update success");
|
return true;
|
}
|
|
/*--------------------------------------
|
;º¯ÊýÃû³Æ: DATA_CHANGE_SINGLE(UC8 Addr)
|
;¹¦ÄÜ: ÓïÒôÊý¾Ýµ¥Ê׸ü»»
|
;Èë²Î:
|
;³ö²Î: 1: ¸ü»»³É¹¦ 0:¸ü»»Ê§°Ü
|
----------------------------------------*/
|
bool DATA_CHANGE_SINGLE(UC8 Addr)
|
{
|
UC16 i = 0;
|
DATA_CHANGE_SINGLE_START(Addr);
|
HAL_Delay(30);
|
|
for(i = 0; i < PACK_LEN; i++)
|
{
|
HAL_Delay(16);
|
Get512Byte();
|
if(DATA_CHANGE_PACK_START() == 1)
|
{
|
HAL_Delay(1);
|
DATA_CHANGE_PACK_SEND(DATA_SONG, 512);
|
}
|
|
else
|
{
|
return false;
|
}
|
}
|
|
DATA_CHANGE_End();
|
return true;
|
}
|
|
void WT588E02B_Init(void)
|
{
|
gpio_pin_set_dir(SPI_CS_PIN, GPIO_DIR_OUT, 1);
|
gpio_pin_set_dir(SPI_CLK_PIN, GPIO_DIR_OUT, 1);
|
gpio_pin_set_dir(SPI_MOSI_PIN, GPIO_DIR_OUT, 1);
|
gpio_pin_set_dir(SPI_MISO_PIN, GPIO_DIR_IN, 0);
|
|
SPI_CS_H();
|
}
|