⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 emeter-communication.c

📁 msp430F437三相电表DEMO(编译器 IAR 3.42A)
💻 C
📖 第 1 页 / 共 3 页
字号:
        flash_clr((int16_t *) next_flash_loc);
        tx_msg.uint8[IEC1107_MSG_TX_START_BODY] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY];
        tx_msg.uint8[IEC1107_MSG_TX_START_BODY + 1] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY + 1] | 0x80;
        prepare_tx_message(2);
        break;
    case HOST_CMD_SET_FLASH_POINTER:
        next_flash_loc = (uint16_t *) rx_msg->uint16[IEC1107_MSG_RX_START_BODY_W + 1];
        tx_msg.uint8[IEC1107_MSG_TX_START_BODY] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY];
        tx_msg.uint8[IEC1107_MSG_TX_START_BODY + 1] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY + 1] | 0x80;
        prepare_tx_message(2);
        break;
    case HOST_CMD_FLASH_DOWNLOAD:
        if (is_calibration_enabled())
        {
            next_flash_loc = (uint16_t *) rx_msg->uint16[IEC1107_MSG_RX_START_BODY_W + 1];
            for (i = 2;  i < (rx_len - 12) >> 1;  i++)
                flash_write_int16((int16_t *) next_flash_loc++, rx_msg->uint16[IEC1107_MSG_RX_START_BODY_W + i]);
            flash_secure();
            /* Return the next address to the host, so it can check for missed messages */
            tx_msg.uint8[IEC1107_MSG_TX_START_BODY] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY];
            tx_msg.uint8[IEC1107_MSG_TX_START_BODY + 1] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY + 1] | 0x80;
            tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 1] = (uint16_t) next_flash_loc;
            prepare_tx_message(4);
        }
        break;
    case HOST_CMD_FLASH_UPLOAD:
        if (is_calibration_enabled())
        {
            next_flash_loc = (uint16_t *) rx_msg->uint16[IEC1107_MSG_RX_START_BODY_W + 1];
            tx_msg.uint8[IEC1107_MSG_TX_START_BODY] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY];
            tx_msg.uint8[IEC1107_MSG_TX_START_BODY + 1] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY + 1] | 0x80;
            for (i = 1;  i < MAX_IEC1107_MSG_BODY/2;  i++)
                tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + i] = *next_flash_loc++;
            prepare_tx_message(MAX_IEC1107_MSG_BODY);
        }
        break;
    case HOST_CMD_ZAP_MEMORY_AREA:
        /* Zap memory area (usually this will be flash) */
        if (is_calibration_enabled())
        {
            next_flash_loc = (uint16_t *) rx_msg->uint16[IEC1107_MSG_RX_START_BODY_W + 1];
            last_flash_loc = (uint16_t *) rx_msg->uint16[IEC1107_MSG_RX_START_BODY_W + 2];
            while (next_flash_loc < last_flash_loc)
                flash_write_int16((int16_t *) next_flash_loc++, rx_msg->uint16[IEC1107_MSG_RX_START_BODY_W + 3]);
            flash_secure();
            tx_msg.uint8[IEC1107_MSG_TX_START_BODY] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY];
            tx_msg.uint8[IEC1107_MSG_TX_START_BODY + 1] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY + 1] | 0x80;
            tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 1] = (uint16_t) next_flash_loc;
            prepare_tx_message(4);
        }
        break;
    case HOST_CMD_SUMCHECK_MEMORY:
        /* Sumcheck a specified memory area, and return the sumcheck */
        if (is_calibration_enabled())
        {
            next_flash_loc = (uint16_t *) rx_msg->uint16[IEC1107_MSG_RX_START_BODY_W + 1];
            last_flash_loc = (uint16_t *) rx_msg->uint16[IEC1107_MSG_RX_START_BODY_W + 2];
            tx_msg.uint8[IEC1107_MSG_TX_START_BODY] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY];
            tx_msg.uint8[IEC1107_MSG_TX_START_BODY + 1] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY + 1] | 0x80;
            tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 1] = 0;
            while (next_flash_loc < last_flash_loc)
                tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 1] += *next_flash_loc++;
            flash_secure();
            prepare_tx_message(4);
        }
        break;
    case HOST_CMD_GET_RAW_POWER_PHASE_1:
    #if !defined(SINGLE_PHASE)
    case HOST_CMD_GET_RAW_POWER_PHASE_2:
    case HOST_CMD_GET_RAW_POWER_PHASE_3:
        phase = &chan[rx_msg->uint8[IEC1107_MSG_RX_START_BODY] - 0x91];
    #endif
        tx_msg.uint8[IEC1107_MSG_TX_START_BODY] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY];
        tx_msg.uint8[IEC1107_MSG_TX_START_BODY + 1] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY + 1] | 0x80;
        tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 1] = phase->current.P_accum_logged[0][0];
        tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 2] = phase->current.P_accum_logged[0][1];
        tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 3] = phase->current.P_accum_logged[0][2];
        tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 4] = phase->sample_count_logged;
        prepare_tx_message(10);
        break;
    #if REACTIVE_POWER_BY_QUADRATURE_SUPPORT
    case HOST_CMD_GET_RAW_REACTIVE_POWER_PHASE_1:
        #if !defined(SINGLE_PHASE)
    case HOST_CMD_GET_RAW_REACTIVE_POWER_PHASE_2:
    case HOST_CMD_GET_RAW_REACTIVE_POWER_PHASE_3:
        phase = &chan[rx_msg->uint8[IEC1107_MSG_RX_START_BODY] - 0x95];
        #endif
        tx_msg.uint8[IEC1107_MSG_TX_START_BODY] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY];
        tx_msg.uint8[IEC1107_MSG_TX_START_BODY + 1] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY + 1] | 0x80;
        tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 1] = phase->current.P_reactive_accum_logged[0][0];
        tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 2] = phase->current.P_reactive_accum_logged[0][1];
        tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 3] = phase->current.P_reactive_accum_logged[0][2];
        tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 4] = phase->sample_count_logged;
        prepare_tx_message(10);
        break;
    #endif
    #if defined(SINGLE_PHASE)  &&  defined(NEUTRAL_MONITOR_SUPPORT)
    case HOST_CMD_GET_RAW_POWER_NEUTRAL:
        tx_msg.uint8[IEC1107_MSG_TX_START_BODY] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY];
        tx_msg.uint8[IEC1107_MSG_TX_START_BODY + 1] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY + 1] | 0x80;
        tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 1] = phase->neutral.P_accum_logged[0][0];
        tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 2] = phase->neutral.P_accum_logged[0][1];
        tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 3] = phase->neutral.P_accum_logged[0][2];
        tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 4] = phase->sample_count_logged;
        prepare_tx_message(10);
        break;
        #if defined(REACTIVE_POWER_BY_QUADRATURE_SUPPORT)
    case HOST_CMD_GET_RAW_REACTIVE_POWER_NEUTRAL:
        tx_msg.uint8[IEC1107_MSG_TX_START_BODY] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY];
        tx_msg.uint8[IEC1107_MSG_TX_START_BODY + 1] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY + 1] | 0x80;
        tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 1] = phase->neutral.P_reactive_accum_logged[0][0];
        tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 2] = phase->neutral.P_reactive_accum_logged[0][1];
        tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 3] = phase->neutral.P_reactive_accum_logged[0][2];
        tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 4] = phase->sample_count_logged;
        prepare_tx_message(10);
        break;
        #endif
    #endif
    case HOST_CMD_CHECK_RTC_ERROR:
        tx_msg.uint8[IEC1107_MSG_TX_START_BODY] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY];
        tx_msg.uint8[IEC1107_MSG_TX_START_BODY + 1] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY + 1] | 0x80;
    #if defined(__MSP430_HAS_TA3__)
        z = assess_rtc_speed();
    #endif
        tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 1] = z;
        tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 2] = z >> 16;
        prepare_tx_message(6);
        break;
    #if defined(CORRECTED_RTC_SUPPORT)
    case HOST_CMD_RTC_CORRECTION:
        tx_msg.uint8[IEC1107_MSG_TX_START_BODY] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY];
        tx_msg.uint8[IEC1107_MSG_TX_START_BODY + 1] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY + 1] | 0x80;
        tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 1] = rtc_correction;
        tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 2] = rtc_correction >> 16;
        prepare_tx_message(6);
        break;
    #endif
    #if defined(MULTI_RATE_SUPPORT)
    case HOST_CMD_MULTIRATE_SET_PARAMETERS:
        i = multirate_put(&rx_msg->uint8[IEC1107_MSG_RX_START_BODY]);
        tx_msg.uint8[IEC1107_MSG_TX_START_BODY] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY];
        tx_msg.uint8[IEC1107_MSG_TX_START_BODY + 1] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY + 1] | 0x80;
        tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 1] = i;
        prepare_tx_message(4);
        break;
    case HOST_CMD_MULTIRATE_GET_PARAMETERS:
        i = multirate_get(&rx_msg->uint8[IEC1107_MSG_RX_START_BODY], &tx_msg.uint8[IEC1107_MSG_TX_START_BODY]);
        prepare_tx_message(i);
        break;
    case HOST_CMD_MULTIRATE_CLEAR_USAGE:
        i = multirate_clear_usage(&rx_msg->uint8[IEC1107_MSG_RX_START_BODY]);
        tx_msg.uint8[IEC1107_MSG_TX_START_BODY] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY];
        tx_msg.uint8[IEC1107_MSG_TX_START_BODY + 1] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY + 1] | 0x80;
        tx_msg.uint16[IEC1107_MSG_TX_START_BODY_W + 1] = i;
        prepare_tx_message(4);
        break;
    case HOST_CMD_MULTIRATE_GET_USAGE:
        i = multirate_get_usage(&rx_msg->uint8[IEC1107_MSG_RX_START_BODY], &tx_msg.uint8[IEC1107_MSG_TX_START_BODY]);
        prepare_tx_message(i);
        break;
    #endif
    default:
        /* For all other message types reply with type 0xFF - bad message type */
        tx_msg.uint8[IEC1107_MSG_TX_START_BODY] = rx_msg->uint8[IEC1107_MSG_RX_START_BODY];
        tx_msg.uint8[IEC1107_MSG_TX_START_BODY + 1] = 0xFF;
        prepare_tx_message(2);
        break;
    }
}
#endif

#if defined(__MSP430__)  &&  (defined(IEC1107_SUPPORT)  ||  defined(SERIAL_CALIBRATION_SUPPORT))  &&  (defined(USART0RX_VECTOR)  ||  defined(USART0RX_ISR))
/* Interrupt to accept IEC1107 messages. */
ISR(USART0RX, serial_rx_interrupt0)
{
    uint8_t ch;
    int i;
    int sum;

    ch = RXBUF0;
    if (char_timeout_1107 == 0)
        rx_msg_ptr = 0;
    char_timeout_1107 = SAMPLES_PER_10_SECONDS/200;
    if (rx_msg_ptr == 0)
    {
        if (ch == 0x68)
        {
            rx_msg.uint8[rx_msg_ptr++] = ch;
            rx_msg_len = 12 + MAX_IEC1107_MSG_BODY;
        }
    }
    else
    {
        if (rx_msg_ptr == 9)
        {
            if (ch <= MAX_IEC1107_MSG_BODY)
                rx_msg_len = 12 + ch;
            else
                rx_msg_ptr = 0;
        }
        rx_msg.uint8[rx_msg_ptr++] = ch;
        if (rx_msg_ptr == rx_msg_len)
        {
            /* End of message */
            sum = rx_msg.uint8[0];
            for (i = 1;  i < rx_msg_len - 2;  i++)
                sum += rx_msg.uint8[i];
            if (rx_msg.uint8[rx_msg_len - 2] == (sum & 0xFF)
                &&
                rx_msg.uint8[rx_msg_len - 1] == 0x16)
            {
                /* Good message received */
                process_rx_message(&rx_msg, rx_msg_len);
            }
            rx_msg_ptr = 0;
        }
    }
}
#endif

#if defined(__MSP430__)  &&  (defined(IEC1107_SUPPORT)  ||  defined(SERIAL_CALIBRATION_SUPPORT))  &&  (defined(USART1RX_VECTOR)  ||  defined(USART1RX_ISR))
/* Interrupt to accept IEC1107 messages. */
ISR(USART1RX, serial_rx_interrupt1)
{
    uint8_t ch;
    int i;
    int sum;

    ch = RXBUF1;
    if (char_timeout_1107 == 0)
        rx_msg_ptr = 0;
    char_timeout_1107 = SAMPLES_PER_10_SECONDS/200;
    if (rx_msg_ptr == 0)
    {
        if (ch == 0x68)
        {
            rx_msg.uint8[rx_msg_ptr++] = ch;
            rx_msg_len = 12 + MAX_IEC1107_MSG_BODY;
        }
    }
    else
    {
        if (rx_msg_ptr == 9)
        {
            if (ch <= MAX_IEC1107_MSG_BODY)
                rx_msg_len = 12 + ch;
            else
                rx_msg_ptr = 0;
        }
        rx_msg.uint8[rx_msg_ptr++] = ch;
        if (rx_msg_ptr == rx_msg_len)
        {
            /* End of message */
            sum = rx_msg.uint8[0];
            for (i = 1;  i < rx_msg_len - 2;  i++)
                sum += rx_msg.uint8[i];
            if (rx_msg.uint8[rx_msg_len - 2] == (sum & 0xFF)
                &&
                rx_msg.uint8[rx_msg_len - 1] == 0x16)
            {
                /* Good message received */
                process_rx_message(&rx_msg, rx_msg_len);
            }
            rx_msg_ptr = 0;
        }
    }
}
#endif

/* Interrupt to send IEC1107 messages. */
#if defined(__MSP430__)  &&  (defined(IEC1107_SUPPORT)  ||  defined(SERIAL_CALIBRATION_SUPPORT))  &&  (defined(USART0TX_VECTOR)  ||  defined(USART0TX_ISR))
ISR(USART0TX, serial_tx_interrupt0)
{
    TXBUF0 = tx_msg.uint8[tx_msg_ptr++];
    if (tx_msg_ptr >= tx_msg_len)
    {
        /* Stop transmission */
        U0IE &= ~UTXIE0;
        tx_msg_ptr = 0;
        tx_msg_len = 0;
    }
}
#endif

#if defined(__MSP430__)  &&  (defined(IEC1107_SUPPORT)  ||  defined(SERIAL_CALIBRATION_SUPPORT))  &&  (defined(USART1TX_VECTOR)  ||  defined(USART1TX_ISR))
ISR(USART1TX, serial_tx_interrupt1)
{
    TXBUF1 = tx_msg.uint8[tx_msg_ptr++];
    if (tx_msg_ptr >= tx_msg_len)
    {
        /* Stop transmission */
        IE2 &= ~UTXIE1;
        tx_msg_ptr = 0;
        tx_msg_len = 0;
    }
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -