#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(); }