/*
* Change Logs:
* Date Author Notes
* 2024-06-25 LCKFB-LP first version
*/
#include "bsp_jq8900.h"
#include "stdio.h"
#include "string.h"
unsigned char JQ8900_RX_BUFF[JQ8900_RX_LEN_MAX];
unsigned char JQ8900_RX_FLAG = 0;
unsigned char JQ8900_RX_LEN = 0;
/************************************************************
* 函数名称:JQ8900_USART_Init
* 函数说明:连接JQ8900的初始化
* 型 参:bund=串口波特率
* 返 回 值:无
* 备 注:无
************************************************************
*/
void JQ8900_USART_Init(unsigned int bund)
{
GPIO_InitTypeDef GPIO_InitStruct; // GPIO初始化结构体
BSP_JQ8900_GPIO_RCC_ENABLE(); // 使能GPIO时钟
BSP_JQ8900_UART_RCC_ENABLE(); // 使能UART时钟
GPIO_InitStruct.Pins = BSP_JQ8900_TX_PIN; // GPIO引脚
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; // 输出速度高
GPIO_Init(BSP_JQ8900_GPIO_PORT, &GPIO_InitStruct); // 初始化
GPIO_InitStruct.Pins = BSP_JQ8900_RX_PIN; // GPIO引脚
GPIO_InitStruct.Mode = GPIO_MODE_INPUT_PULLUP; // 上拉输入
GPIO_Init(BSP_JQ8900_GPIO_PORT, &GPIO_InitStruct); // 初始化
BSP_JQ8900_AF_UART_TX(); // UART_TX复用
BSP_JQ8900_AF_UART_RX(); // UART_RX复用
// 配置UART
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = bund; // 波特率
USART_InitStructure.USART_Over = USART_Over_16; // 配置USART的过采样率。
USART_InitStructure.USART_Source = USART_Source_PCLK; // 设置时钟源
USART_InitStructure.USART_UclkFreq = 64000000; //设置USART时钟频率(和主频一致即可)
USART_InitStructure.USART_StartBit = USART_StartBit_FE; //RXD下降沿开始
USART_InitStructure.USART_StopBits = USART_StopBits_1; // 停止位1
USART_InitStructure.USART_Parity = USART_Parity_No ; // 不使用校验
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 不使用流控
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 收发模式
USART_Init(BSP_JQ8900_UART, &USART_InitStructure); // 初始化串口2
// 优先级,无优先级分组
NVIC_SetPriority(BSP_JQ8900_IRQ, 0);
// UARTx中断使能
NVIC_EnableIRQ(BSP_JQ8900_IRQ);
// 使能UARTx RC中断
USART_ITConfig(BSP_JQ8900_UART, USART_IT_RC, ENABLE);
}
/******************************************************************
* 函 数 名 称:JQ8900_USART_Send_Bit
* 函 数 说 明:向JQ8900模块发送单个字符
* 函 数 形 参:ch=字符
* 函 数 返 回:无
* 作 者:LC
* 备 注:无
******************************************************************/
void JQ8900_USART_Send_Bit(unsigned char ch)
{
USART_SendData(BSP_JQ8900_UART, (uint8_t)ch);
while( RESET == USART_GetFlagStatus(BSP_JQ8900_UART, USART_FLAG_TXE) ){} // 等待发送数据缓冲区标志置位
}
/******************************************************************
* 函 数 名 称:JQ8900_USART_send_String
* 函 数 说 明:向JQ8900模块发送字符串
* 函 数 形 参:str=发送的字符串
* 函 数 返 回:无
* 作 者:LC
* 备 注:无
******************************************************************/
void JQ8900_USART_send_String(unsigned char *str, unsigned int len)
{
while( len-- )
{
JQ8900_USART_Send_Bit(*str++);
}
}
//清除串口接收的数据
/******************************************************************
* 函 数 名 称:Clear_JQ8900_RX_BUFF
* 函 数 说 明:清除JQ8900发过来的数据
* 函 数 形 参:无
* 函 数 返 回:无
* 作 者:LC
* 备 注:无
******************************************************************/
void Clear_JQ8900_RX_BUFF(void)
{
unsigned char i = JQ8900_RX_LEN_MAX-1;
while(i)
{
JQ8900_RX_BUFF[i--] = 0;
}
JQ8900_RX_LEN = 0;
JQ8900_RX_FLAG = 0;
}
/******************************************************************
* 函 数 名 称:JQ8900_Init
* 函 数 说 明:JQ8900模块初始化
* 函 数 形 参:无
* 函 数 返 回:无
* 作 者:LC
* 备 注:JQ8900的默认波特率是9600
******************************************************************/
void JQ8900_Init(void)
{
JQ8900_USART_Init(9600);//默认波特率为9600
GPIO_InitTypeDef GPIO_InitStruct; // GPIO初始化结构体
BSP_JQ8900_GPIO_RCC_ENABLE(); // 使能GPIO时钟
GPIO_InitStruct.Pins = GPIO_JQ8900_APP; // GPIO引脚
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; // 输出速度高
GPIO_Init(BSP_JQ8900_GPIO_PORT, &GPIO_InitStruct); // 初始化
SET_JQ8900_APP(1);
}
/**********************************************************
* 函 数 名 称:SendData
* 函 数 功 能:一线串行通信控制
* 传 入 参 数:addr=发送的指令
* 函 数 返 回:无
* 作 者:LC
* 备 注:无
**********************************************************/
void SendData ( unsigned char addr )
{
unsigned char i;
SET_JQ8900_APP(1); /*开始拉高 */
delay_us ( 500 );
SET_JQ8900_APP(0);/*开始引导码*/
delay_ms ( 4 );/*此处延时最少要大于2ms,官方建议4MS */
for ( i = 0; i < 8; i++ ) /*总共8位数据,从低位开始 */
{
//数据总是从1开始
SET_JQ8900_APP(1);
if ( addr & 0x01 )
{
delay_us ( 1300 );/*3:1表示数据位1,每个位用两个脉冲表示 */
SET_JQ8900_APP(0);
delay_us ( 500 );
}
else
{
delay_us ( 500 );/*1:3表示数据位0 ,每个位用两个脉冲表示 */
SET_JQ8900_APP(0);
delay_us ( 1300 );
}
addr >>= 1;
}
SET_JQ8900_APP(1);
delay_ms(10);//两个字节之间延时建议在10ms以上
}
/******************************************************************
* 函 数 名 称:JQ8900_USART_IRQHandler
* 函 数 说 明:连接JQ8900的串口中断服务函数
* 函 数 形 参:无
* 函 数 返 回:无
* 作 者:LC
* 备 注:无
******************************************************************/
void JQ8900_USART_IRQHandler(void)
{
if(USART_GetITStatus(BSP_JQ8900_UART,USART_IT_RC) != RESET) // 接收缓冲区不为空
{
//接收数据
JQ8900_RX_BUFF[ JQ8900_RX_LEN ] = USART_ReceiveData(BSP_JQ8900_UART);
#if DEBUG
//测试,查看接收到了什么数据
printf("%c", JQ8900_RX_BUFF[ JQ8900_RX_LEN ]);
#endif
//接收长度限制
JQ8900_RX_LEN = ( JQ8900_RX_LEN + 1 ) % JQ8900_RX_LEN_MAX;
JQ8900_RX_BUFF[JQ8900_RX_LEN] = '\0'; //字符串结尾补 '\0'
JQ8900_RX_FLAG = SET; // 接收完成
USART_ClearITPendingBit(BSP_JQ8900_UART, USART_IT_RC); // 清除中断标志位
}
}