前回、esp32 ドライバー JQ8900 モジュールを書きましたが、設計するときは通常、最初にペリフェラルを esp32 に実装し、次にそれらをより複雑な stm32 に移植します。正常に実行されているドライコードを直接アップロードします。
1. ハードウェアの準備
STM32F10x シリーズの開発ボード (ここでは f103zet6 時間厳守アトム開発ボードを使用)
JQ8900 ブロードキャスト モジュール 1 つ、スピーカー 1 つ、12V/5V 電源アダプタ 1 つ、DuPont ライン数本
2. プログラミング
1.jq8900.c
コードは以下のように表示されます。
#include "jq8900.h"
#include "delay.h"
#include "stm32f10x.h"
///
//函 OnUart_GPIO(void)
//功 能:语音模块一线串口IO口
//输入参数: void
//输出参数: void
//说 明:
//
void OnUart_GPIO(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC->APB2ENR|=1<<3; //GPIOB
//GPIOB.11
GPIOB->CRH&=0xFFFF0FFF; //清零
GPIOB->CRH|=0x00003000; //推挽输出 50MHZ
GPIOB->ODR=~(1<<11); //B.11低
}
void delay1_us(u32 nTimer)
{
u32 i=0;
for(i=0;i<nTimer;i++){
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
}
}
///
//函 数:SendData(u8 addr)
//功 能:语音模块一线串口
//输入参数: addr要发送的0x数
//输出参数: void
//说 明:
//
void SendData(u8 addr)//发送函数。
{
u8 i;
/*发送时关掉中断,防止中断影响时序 */
SDA = 1; /*开始拉高*/
delay1_us ( 1000 );
SDA = 0; /*开始引导码*/
delay1_us ( 3200 );/*此处延时最少要大于2ms*/
for ( i = 0; i < 8; i++ ) /*总共8位数据 */
{
SDA = 1;
if ( addr & 0x01 ) /*3:1表示数据位1,每个位用两个脉冲表示 */
{
delay1_us ( 600 );
SDA = 0;
delay1_us ( 200 );
}
else /*1:3表示数据位0 ,每个位用两个脉冲表示 */
{
delay1_us ( 200 );
SDA = 0;
delay1_us ( 600 );
}
addr >>= 1;
}
SDA = 1;
//恢复中断
}
このコードは主に、データを初期化し、音声モジュールの最初の回線のシリアル ポートに送信するためのものです。
初期化プロセスでは、GPIOB.11 をシリアル ポートのデータ ラインとして使用し、プッシュプル出力モードに設定し、Low にプルします。
データを送信する際は、まずスタート信号としてデータラインを1ms間Highにし、その後データ送信の開始を示す2ms以上のLowレベルのブートコードを送信します。次にデータを送信します。各データ ビットは 2 つのパルスで表されます。データ ビット 1 は、ハイ レベルが 600 マイクロ秒を占有し、ロー レベルが 200 マイクロ秒を占有する 2 つのパルスで表され、データ ビット 0 は、ハイ レベルが 200 マイクロ秒を占有し、ロー レベルが 2 マイクロ秒を占有することで表されます。 600usのパルスを表します。最後に、データ ラインを High に引き上げて、データ送信の終了を示します。
割り込みによるタイミングへの影響を防ぐため、データ送信時には割り込みをオフにする必要があることに注意してください。データの送信後に割り込みを再開する必要があります。
2.jq8900.h
コードは以下のように表示されます。
#ifndef __JQ8900_H
#define __JQ8900_H
#include "sys.h"
#define SDA PBout(11)
void SendData ( u8 addr ); //发送函数。
void OnUart_GPIO(void); //GPIO
void delay1_us(u32 nTimer);
void show_number1();
#endif
3.main.c
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "jq8900.h"
int main(void)
{
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
OnUart_GPIO();
while(1)
{
show_number1();
delay_ms(2000);
}
}
非常に単純なコードで、最初の行のシリアル ポートを初期化した後、無限ループで関数 show_number1() を呼び出し、2 秒ごとにオーディオを再生します。esp32からオーディオを呼び出すのと同様に、オーディオ1を再生するプログラムも記述します。
void show_number1()
{
//设置音量为20
SendData(0x0a); //清空数字
SendData(0x02); //音量20
SendData(0x00);
SendData(0x0c); //设置音量
delay_ms(2000); //延时
//选取曲目1播放
SendData(0x0a);//清空数字
SendData(0x01);//曲目数字,对应00001.mp3
SendData(0x0b);//选曲播放
delay_ms(2000);
//开始播放
//SendData(0x11);//开始播放
//delay(2000);
}
このコードは主に音声モジュールを操作するもので、指定したトラックの再生や音量設定などの機能を実現します。
指定されたトラックを再生する場合、音声モジュールは、そのトラックに対応する番号と選択されたトラックの再生コマンドを送信することによって、指定されたトラックを再生させる。このコードでは、トラック 1 が再生するように選択されています。
音量を設定する場合は、音量に対応する番号と音量を設定するコマンドを送信することで、音声モジュールに指定された音量を設定させます。このコードでは、音量は 20 に設定されています。
3. オーディオの置き換え
JQ8900 は、小さな U ディスクと同様のデータ ケーブルを介してコンピュータに接続できます。テキスト変換ソフトウェアを使用して、必要な .MP3 形式のファイルを生成し、名前を 0000x に変更できます。JQ8900 のフラッシュは 4M しかないので、大規模なオーディオはスペースを取りすぎるため、インポートしないことをお勧めします。
要約する
記事を書きましたが、JQ8900モジュールの更なる応用も完了しました。