-
一开始打算用单总线的通信方式
-
通过文档上的介绍找到 ONE LINE 的一线串口脚
-
//使能GPIO口 //按照时序图编写程序 /* 模块——————————单片机 ONE LINE—————————PC6 DC-5V———————————5V GND———————————GND busy ==== pc8 */ /* * 功 能:ONEUART初始化 * 参 数:无 * 返回值:无 */ void ONEUART_Init(void) { //定义一个 GPIO 结构体变量 GPIO_InitTypeDef GPIO_InitStruct ; //1、开启 GPIOG 组时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); //2、配置以及初始化 GPIO GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //输出模式 GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //推挽 GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上拉 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //输出速度 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6; //设置引脚 GPIO_Init(GPIOG, &GPIO_InitStruct); //使用配置好的结构体去初始化相应的GPIO口 // 拉高电平 GPIO_SetBits(GPIOC,GPIO_Pin_6); //2、配置以及初始化 GPIO GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; //输入模式 GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; //推挽 GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; //上拉 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8; //设置引脚 GPIO_Init(GPIOG, &GPIO_InitStruct); //使用配置好的结构体去初始化相应的GPIO口 // 拉高电平 GPIO_SetBits(GPIOC,GPIO_Pin_8); } /* * 功 能:ONEUART发送字节 * 参 数:无 * 返回值:无 */ void ONEUART_SendData(u8 addr) { u8 i = 0; //开始拉高 ONEUART_out(1); delay_ms(2); ONEUART_out(0); delay_ms(4); //send byte for( i = 0 ; i < 8 ; i++) { ONEUART_out(1); if(addr & 0x01) { delay_us(1200); ONEUART_out(0); delay_us(400); } else { delay_us(400); ONEUART_out(0); delay_us(1200); } addr =addr>>1; } ONEUART_out(1); delay_ms(10); }
查看手册
音频文件已经提前加入JQ8400芯片,程序执行后busy位(播放会拉高)始终为低电位,
一开始怀疑时序函数有问题,用dht11接收了数据后发现正常,
然后怀疑是模块有问题,决定再试试串口通信
================= == == ======== 分割线 ==============================================
继续查看手册
/*
RX ----- TX PA3
TX ------ RX PA2
*/
/*
* 功 能:UART2 的初始化
* 参 数:
* BaudRate --->波特率,就是常见的那些 115200 9600 38400 ...
* 返回值:无
* 说 明:收发双方的波特率必须一致
*/
void UART2_Init(uint32_t BaudRate)
{
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef USART_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
//1、开启串口1时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
//2、开启 PA2 PA3 时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA ,ENABLE);
//3、将 PA2 PA3 复用为 串口1 的特殊功能引脚
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART1);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;//复用功能!!!!
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
//4、配置串口的模式
USART_InitStruct.USART_BaudRate = BaudRate; //波特率
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//关闭硬件流控
USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发
USART_InitStruct.USART_Parity = USART_Parity_No; //无检验位
USART_InitStruct.USART_StopBits = USART_StopBits_1; //1位停止位
USART_InitStruct.USART_WordLength = USART_WordLength_8b; //8位数据位
USART_Init(USART2 ,&USART_InitStruct);
//5、开启 接收 中断
USART_ITConfig(USART2 , USART_IT_RXNE ,ENABLE);
//6、使能 NVIC
NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&NVIC_InitStruct);
USART_Cmd(USART2 ,ENABLE);
}
主函数发送 AA 02 00 AC 开始播放
//发送数据
USART_SendData(USART2,0xaa);
//检测是否发送完成
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
//发送数据
USART_SendData(USART2,0x02);
//检测是否发送完成
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
//发送数据
USART_SendData(USART2,0x00);
//检测是否发送完成
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
//发送数据
USART_SendData(USART2,0xac);
delay_s(4);