198 lines
5.1 KiB
C
198 lines
5.1 KiB
C
#include "user.h"
|
|
|
|
|
|
//串口2为485接口
|
|
volatile uint8_t usart2_count = 0; //串口接收数据个数
|
|
uint8_t Rx2_Buff[BUFF_LEN] = {0}; //串口接收缓冲区
|
|
uint8_t Tx2_Buff[BUFF_LEN] = {0}; //串口发送缓冲区
|
|
uint8_t u2_Buff[BUFF_LEN] = {0}; //用户缓冲区
|
|
|
|
//串口3为lora通讯口
|
|
volatile uint8_t usart3_count = 0; //串口接收数据个数
|
|
uint8_t Rx3_Buff[BUFF_LEN] = {0}; //串口接收缓冲区
|
|
uint8_t Tx3_Buff[BUFF_LEN] = {0}; //串口发送缓冲区
|
|
uint8_t u3_Buff[BUFF_LEN] = {0}; //用户缓冲区
|
|
|
|
volatile uint8_t usart1_count = 0; //串口接收数据个数
|
|
uint8_t Rx1_Buff[BUFF_LEN] = {0}; //串口接收缓冲区
|
|
uint8_t Tx1_Buff[BUFF_LEN] = {0}; //串口发送缓冲区
|
|
uint8_t u1_Buff[BUFF_LEN] = {0}; //用户缓冲区
|
|
|
|
uint8_t ADC_Wavedata[512] ={ 0};
|
|
|
|
volatile uint16_t RS485ADDR = 1;
|
|
int16_t user_register[10] ={0};
|
|
|
|
|
|
|
|
void user_init(void)
|
|
{
|
|
bsp_InitTimer();
|
|
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
|
|
__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_TC);
|
|
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
|
|
|
|
HAL_UART_DMAStop(&huart1);//复位DMA //串口DMA接受
|
|
HAL_UART_Receive_DMA(&huart1,(uint8_t *)Rx1_Buff,sizeof(Rx1_Buff));
|
|
|
|
__HAL_UART_ENABLE_IT(&huart3,UART_IT_IDLE);
|
|
__HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_TC);
|
|
__HAL_UART_CLEAR_IDLEFLAG(&huart3);
|
|
|
|
HAL_UART_DMAStop(&huart3);//复位DMA //串口DMA接受
|
|
HAL_UART_Receive_DMA(&huart3,(uint8_t *)Rx3_Buff,sizeof(Rx3_Buff));
|
|
|
|
|
|
// __HAL_UART_CLEAR_IT(&huart2,UART_CLEAR_IDLEF|UART_CLEAR_TCF);
|
|
|
|
}
|
|
|
|
void Usart_Receive()
|
|
{
|
|
if( (uint16_t)u3_Buff[0] == RS485ADDR && usart3_count == 8)
|
|
{
|
|
switch(u3_Buff[1])
|
|
{
|
|
case 0x03: //读传感器数据
|
|
MODBUS_03H();
|
|
break;
|
|
|
|
case 0x06:
|
|
MODBUS_06H();
|
|
break;
|
|
|
|
default:break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void MODBUS_03H()
|
|
{
|
|
//接收到的数据帧
|
|
//485地址 功能位 寄存器地址 寄存器个数 crc低位 crc高位
|
|
uint8_t crch,crcl;
|
|
uint16_t crcack;
|
|
uint16_t addr = (uint16_t)u3_Buff[2]<<8 | u3_Buff[3]; //寄存器地址
|
|
uint16_t number = (uint16_t)u3_Buff[4]<<8 | u3_Buff[5]; //寄存器数量
|
|
uint16_t crc = crc16_modbus(u3_Buff,6); //计算CRC
|
|
crch = crc>>8;
|
|
crcl = crc&0x00FF;
|
|
|
|
user_register[1] = (int16_t)Vol*Kv;
|
|
user_register[2] = (int16_t)IA*Ki;
|
|
|
|
|
|
if( (addr+number) <= 3 && crcl == u3_Buff[6] && crch == u3_Buff[7])
|
|
{
|
|
uint8_t cnt = 0;
|
|
Tx3_Buff[cnt++] = u3_Buff[0];
|
|
Tx3_Buff[cnt++] = u3_Buff[1];
|
|
Tx3_Buff[cnt++] = number*2; //数据个数,单位/字节
|
|
for(uint8_t i =0;i<number;i++)
|
|
{
|
|
Tx3_Buff[cnt++] = user_register[addr+i] >>8;
|
|
Tx3_Buff[cnt++] = user_register[addr+i] & 0xFF;
|
|
}
|
|
crcack = crc16_modbus(Tx3_Buff,cnt);
|
|
Tx3_Buff[cnt++] = crcack & 0xff;
|
|
Tx3_Buff[cnt++] = crcack >>8;
|
|
HAL_UART_Transmit_DMA(&huart3,Tx3_Buff,cnt);
|
|
}
|
|
}
|
|
|
|
void MODBUS_06H(void)
|
|
{
|
|
int16_t data = ((int16_t)u3_Buff[4]<<8)|u3_Buff[5]; //要修改的数据
|
|
uint16_t reg = ((int16_t)u3_Buff[2]<<8)|u3_Buff[3]; //寄存器地址
|
|
uint16_t crc = crc16_modbus( u3_Buff,6); //计算CRC
|
|
|
|
for(uint8_t i = 0; i<6; i++)
|
|
{
|
|
Tx3_Buff[i] = u3_Buff[i];
|
|
}
|
|
Tx3_Buff[6] = crc&0xff;
|
|
Tx3_Buff[7] = crc>>8;
|
|
|
|
//修改地址
|
|
if(reg == 0x0001 && Tx3_Buff[6]== u3_Buff[6] && Tx3_Buff[7]== u3_Buff[7])
|
|
{
|
|
Kv = data/Vol;
|
|
HAL_UART_Transmit_DMA(&huart3,Tx3_Buff,8);
|
|
}
|
|
|
|
if(reg == 0x0002 && Tx3_Buff[6]== u3_Buff[6] && Tx3_Buff[7]== u3_Buff[7])
|
|
{
|
|
Ki = data/IA;
|
|
HAL_UART_Transmit_DMA(&huart3,Tx3_Buff,8);
|
|
}
|
|
}
|
|
|
|
/************************************************************
|
|
* Name: CRC-16/MODBUS x16+x15+x2+1
|
|
* Poly: 0x8005
|
|
* Init: 0xFFFF
|
|
* Refin: True
|
|
* Refout: True
|
|
* Xorout: 0x0000
|
|
* Note:
|
|
**********************************************************/
|
|
uint16_t crc16_modbus(uint8_t *data, uint16_t length)
|
|
{
|
|
uint8_t i;
|
|
uint16_t crc = 0xffff; // Initial value
|
|
while(length--)
|
|
{
|
|
crc ^= *data++; // crc ^= *data; data++;
|
|
for (i = 0; i < 8; ++i)
|
|
{
|
|
if (crc & 1)
|
|
crc = (crc >> 1) ^ 0xA001; // 0xA001 = reverse 0x8005
|
|
else
|
|
crc = (crc >> 1);
|
|
}
|
|
}
|
|
return crc;
|
|
}
|
|
|
|
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
|
|
{
|
|
uint16_t tmp16;
|
|
uint8_t tmp8 = 0;
|
|
uint8_t data[5] = {0};
|
|
uint8_t data1[300];
|
|
static uint8_t cnt =0;
|
|
if(GPIO_Pin == IRQ_Pin)
|
|
{
|
|
tmp8 = READ_SPI(WAVE_IF,1);
|
|
sprintf(Tx3_Buff,"WAVE_IF:0x%x",tmp8);
|
|
HAL_UART_Transmit_DMA(&huart3,Tx3_Buff,strlen(Tx3_Buff));
|
|
if(tmp8 & 0x02)
|
|
{
|
|
// SPI_CS_LOW();
|
|
// data[0] = 0xEA;
|
|
// data[1] = 0xAC;
|
|
// data[2] = ~(data[0]+data[1]);
|
|
// HAL_SPI_Transmit(&hspi1,data,3,SPI_TIMEOUT);
|
|
// HAL_SPI_Receive(&hspi1,data1,300,SPI_TIMEOUT);
|
|
// SPI_CS_HIGH();
|
|
cnt++;
|
|
}
|
|
if((tmp8&0x01) == 0 && (tmp8 & 0x02) ==1)
|
|
{
|
|
cnt++;
|
|
SPI_CS_LOW();
|
|
//连续读波性数据
|
|
// data[0] = 0xEA;
|
|
// data[1] = 0xAE;
|
|
// data[2] = 0;
|
|
// data[3] = 0xff;
|
|
// data[4] = ~(data[0]+data[1]+data[2]+data[3]);
|
|
// HAL_SPI_Transmit(&hspi1,data,3,SPI_TIMEOUT);
|
|
// HAL_SPI_Receive(&hspi1,ADC_Wavedata,256,SPI_TIMEOUT);
|
|
// SPI_CS_HIGH();
|
|
|
|
}
|
|
|
|
}
|
|
tmp16 = READ_SPI(WAVE_IF,1);
|
|
} |