Initial commit: my SECS2 project
This commit is contained in:
192
usr/algo/algo_queue.c
Normal file
192
usr/algo/algo_queue.c
Normal file
@@ -0,0 +1,192 @@
|
||||
#include "algo_queue.h"
|
||||
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>i<EFBFBD><69>Ԫ<EFBFBD>صĵ<D8B5>ַ */
|
||||
#define at(i) (((char *)(queue->base))+(i)*(queue->dsize))
|
||||
/* <20><><EFBFBD>ݸ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4>ַs<D6B7><73><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><DDB8>Ƶ<EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD>ַd */
|
||||
#define assign(d, s) memcpy((d), (s), queue->dsize)
|
||||
/* <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>i<EFBFBD><69>Ԫ<EFBFBD>ص<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD> */
|
||||
#define qa(i) at((queue->head + queue->capacity + (i)) % (queue->capacity))
|
||||
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD>ڴ渴<DAB4>ƺ<EFBFBD><C6BA><EFBFBD> */
|
||||
static void* memcpy(void* dest, const void* src, int n)
|
||||
{
|
||||
char* dst = dest;
|
||||
const char* s = src;
|
||||
while (n--) *dst++ = *s++;
|
||||
return dest;
|
||||
}
|
||||
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD>index<65><78>ʼ<EFBFBD><CABC>size<7A><65>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>ǰ<EFBFBD>ƶ<EFBFBD>һλ */
|
||||
static void move_forward(queue queue, int index, int size)
|
||||
{
|
||||
for (int i = index; i < index + size; i++) assign(qa(i - 1), qa(i));
|
||||
}
|
||||
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD>index<65><78>ʼ<EFBFBD><CABC>size<7A><65>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>һλ */
|
||||
static void move_backward(queue queue, int index, int size)
|
||||
{
|
||||
for (int i = index + size; i > index; i--) assign(qa(i), qa(i - 1));
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief <20><><EFBFBD><D7BC><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>ӣ<EFBFBD>
|
||||
* \param[in] queue: <20><><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>ָ<EFBFBD><D6B8>
|
||||
* \param[in] data: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ<EFBFBD><D6B7>NULL<4C><4C>ʾ<EFBFBD><CABE><EFBFBD>ƶ<EFBFBD>ָ<EFBFBD>룩
|
||||
* \return 1=<3D>ɹ<EFBFBD>, 0=ʧ<>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*
|
||||
* \details <20>ڶ<EFBFBD><DAB6><EFBFBD>β<EFBFBD><CEB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ء<EFBFBD><D8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܡ<EFBFBD>
|
||||
* <20><>data<74><61>ΪNULLʱ<4C><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><DDB8>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>д洢<D0B4><E6B4A2><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD>βָ<CEB2><D6B8><EFBFBD>Ͷ<EFBFBD><CDB6>д<EFBFBD>С<EFBFBD><D0A1>
|
||||
*/
|
||||
int queue_push(queue queue, void* data)
|
||||
{
|
||||
if (!queue) return 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
|
||||
if (queue->size == queue->capacity) return 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (data) assign(at(queue->tail), data); // <20><><EFBFBD>ݸ<EFBFBD><DDB8>Ƶ<EFBFBD><C6B5><EFBFBD>β
|
||||
queue->tail = (queue->tail + 1) % queue->capacity; // <20><><EFBFBD><EFBFBD>βָ<CEB2>루ѭ<EBA3A8><D1AD><EFBFBD><EFBFBD>
|
||||
queue->size++; // <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief ǿ<><C7BF><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD>ӣ<EFBFBD>
|
||||
* \param[in] queue: <20><><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>ָ<EFBFBD><D6B8>
|
||||
* \param[in] data: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ<EFBFBD><D6B7>NULL<4C><4C>ʾ<EFBFBD><CABE><EFBFBD>ƶ<EFBFBD>ָ<EFBFBD>룩
|
||||
* \return 1=<3D>ɹ<EFBFBD>, 0=ʧ<>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Чʱ<D0A7><CAB1>
|
||||
*
|
||||
* \details <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4>ʱ<EFBFBD><CAB1>ͬ<EFBFBD><CDAC>queue_push()<29><>
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD>
|
||||
* ʵ<><CAB5>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>
|
||||
*/
|
||||
int queue_push2(queue queue, void* data)
|
||||
{
|
||||
if (!queue) return 0;
|
||||
if (queue->size < queue->capacity) return queue_push(queue, data); // <20><><EFBFBD><EFBFBD>δ<EFBFBD><CEB4>ʱ<EFBFBD><CAB1><EFBFBD>ñ<EFBFBD><EFBFBD><D7BC><EFBFBD><EFBFBD>
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>Ƕ<EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>ݣ<EFBFBD>ʵ<EFBFBD><CAB5>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD>ǣ<EFBFBD>
|
||||
if (data) assign(at(queue->tail), data);
|
||||
queue->tail = (queue->tail + 1) % queue->capacity;
|
||||
queue->head = (queue->head + 1) % queue->capacity; // ͷָ<CDB7><D6B8><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief <20><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD>
|
||||
* \param[in] queue: <20><><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>ָ<EFBFBD><D6B8>
|
||||
* \param[out] data: <20><><EFBFBD>ݽ<EFBFBD><DDBD>յ<EFBFBD>ַ<EFBFBD><D6B7>NULL<4C><4C>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>
|
||||
* \return 1=<3D>ɹ<EFBFBD>, 0=ʧ<>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>Ϊ<EFBFBD>գ<EFBFBD>
|
||||
*
|
||||
* \details <20>Ӷ<EFBFBD><D3B6><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>Ƴ<EFBFBD>Ԫ<EFBFBD>ء<EFBFBD><D8A1><EFBFBD><EFBFBD><EFBFBD>data<74><61>ΪNULL<4C><4C>
|
||||
* <20><><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD>Ԫ<EFBFBD>ظ<EFBFBD><D8B8>Ƶ<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>
|
||||
* <20><><EFBFBD><EFBFBD>ͷָ<CDB7><D6B8><EFBFBD>Ͷ<EFBFBD><CDB6>д<EFBFBD>С<EFBFBD><D0A1>
|
||||
*/
|
||||
int queue_pop(queue queue, void* data)
|
||||
{
|
||||
if (!queue) return 0;
|
||||
if (queue->size == 0) return 0; // <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>
|
||||
if (data) assign(data, at(queue->head)); // <20><><EFBFBD>ƶ<EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD>
|
||||
queue->head = (queue->head + 1) % queue->capacity; // <20><><EFBFBD><EFBFBD>ͷָ<CDB7>루ѭ<EBA3A8><D1AD><EFBFBD><EFBFBD>
|
||||
queue->size--; // <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief ָ<><D6B8>λ<EFBFBD>ò<EFBFBD><C3B2><EFBFBD>Ԫ<EFBFBD><D4AA>
|
||||
* \param[in] queue: <20><><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>ָ<EFBFBD><D6B8>
|
||||
* \param[in] index: <20><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0=<3D><>ͷ, size=<3D><>β<EFBFBD><CEB2>
|
||||
* \param[in] data: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ<EFBFBD><D6B7>NULL<4C><4C>ʾ<EFBFBD><CABE><EFBFBD>ճ<EFBFBD>λ<EFBFBD>ã<EFBFBD>
|
||||
* \return 1=<3D>ɹ<EFBFBD>, 0=ʧ<>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*
|
||||
* \details <20><>ָ<EFBFBD><D6B8>λ<EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>أ<EFBFBD><D8A3><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>غ<EFBFBD><D8BA>ơ<EFBFBD>
|
||||
* <20>Զ<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>ƻ<EFBFBD><C6BB><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>أ<EFBFBD><D8A3><EFBFBD>
|
||||
* ʱ<>临<EFBFBD>Ӷ<EFBFBD>O(min(index, size-index))<29><>
|
||||
*/
|
||||
int queue_insert(queue queue, int index, void* data)
|
||||
{
|
||||
if (!queue) return 0;
|
||||
if (index < 0 || index > queue->size) return 0; // <20><><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (queue->size == queue->capacity) return 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
// <20><><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>λ<EFBFBD><CEBB>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (index <= queue->size / 2) {
|
||||
// <20><>ǰ<EFBFBD>ƶ<EFBFBD>ǰ<EFBFBD>벿<EFBFBD><EBB2BF>Ԫ<EFBFBD><D4AA>
|
||||
move_forward(queue, 0, index);
|
||||
queue->head = (queue->head + queue->capacity - 1) % queue->capacity; // ͷָ<CDB7><D6B8>ǰ<EFBFBD><C7B0>
|
||||
} else {
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD>벿<EFBFBD><EBB2BF>Ԫ<EFBFBD><D4AA>
|
||||
move_backward(queue, index, queue->size - index);
|
||||
queue->tail = (queue->tail + 1) % queue->capacity; // βָ<CEB2><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
|
||||
// <20>ڿճ<DABF><D5B3><EFBFBD>λ<EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (data) assign(at((queue->head + index) % (queue->capacity)), data);
|
||||
queue->size++;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief ָ<><D6B8>λ<EFBFBD><CEBB>ɾ<EFBFBD><C9BE>Ԫ<EFBFBD><D4AA>
|
||||
* \param[in] queue: <20><><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>ָ<EFBFBD><D6B8>
|
||||
* \param[in] index: ɾ<><C9BE>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0=<3D><>ͷ, size-1=<3D><>β<EFBFBD><CEB2>
|
||||
* \param[out] data: <20><><EFBFBD>ݽ<EFBFBD><DDBD>յ<EFBFBD>ַ<EFBFBD><D6B7>NULL<4C><4C>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>
|
||||
* \return 1=<3D>ɹ<EFBFBD>, 0=ʧ<>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>գ<EFBFBD>
|
||||
*
|
||||
* \details ɾ<><C9BE>ָ<EFBFBD><D6B8>λ<EFBFBD><CEBB>Ԫ<EFBFBD>أ<EFBFBD><D8A3><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>ǰ<EFBFBD>ơ<EFBFBD>
|
||||
* <20>Զ<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* ʱ<>临<EFBFBD>Ӷ<EFBFBD>O(min(index, size-index))<29><>
|
||||
*/
|
||||
int queue_erase(queue queue, int index, void* data)
|
||||
{
|
||||
if (!queue) return 0;
|
||||
if (index < 0 || index >= queue->size) return 0; // <20><><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (queue->size == 0) return 0; // <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>
|
||||
|
||||
// <20><><EFBFBD>汻ɾ<E6B1BB><C9BE>Ԫ<EFBFBD>أ<EFBFBD><D8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>
|
||||
if (data) assign(data, at((queue->head + index) % (queue->capacity)));
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE>λ<EFBFBD><CEBB>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (index <= queue->size / 2) {
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>ǰ<EFBFBD>벿<EFBFBD><EBB2BF>Ԫ<EFBFBD><D4AA>
|
||||
move_backward(queue, 0, index);
|
||||
queue->head = (queue->head + 1) % queue->capacity; // ͷָ<CDB7><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
} else {
|
||||
// <20><>ǰ<EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD>벿<EFBFBD><EBB2BF>Ԫ<EFBFBD><D4AA>
|
||||
move_forward(queue, index + 1, queue->size - index - 1);
|
||||
queue->tail = (queue->tail + queue->capacity - 1) % queue->capacity; // βָ<CEB2><D6B8>ǰ<EFBFBD><C7B0>
|
||||
}
|
||||
|
||||
queue->size--;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief <20><><EFBFBD>ն<EFBFBD><D5B6><EFBFBD>
|
||||
* \param[in] queue: <20><><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>ָ<EFBFBD><D6B8>
|
||||
*
|
||||
* \details <20><><EFBFBD>ö<EFBFBD><C3B6><EFBFBD>״̬<D7B4><CCAC>ͷβָ<CEB2><D6B8><EFBFBD><EFBFBD><EFBFBD>㣬<EFBFBD><E3A3AC>С<EFBFBD><D0A1><EFBFBD>㣩<EFBFBD><E3A3A9>
|
||||
* <20><><EFBFBD>ͷŴ洢<C5B4>ڴ棬<DAB4><E6A3AC><EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>䡣
|
||||
*/
|
||||
void queue_clear(queue queue)
|
||||
{
|
||||
if (!queue) return;
|
||||
queue->tail = 0;
|
||||
queue->head = 0;
|
||||
queue->size = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief <20><>ȡԪ<C8A1>ص<EFBFBD>ַ
|
||||
* \param[in] queue: <20><><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>ָ<EFBFBD><D6B8>
|
||||
* \param[in] index: Ԫ<><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0=<3D><>ͷ, size-1=<3D><>β<EFBFBD><CEB2>
|
||||
* \return Ԫ<>ص<EFBFBD>ַ<EFBFBD><D6B7>ʧ<EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD>NULL<4C><4C>
|
||||
*
|
||||
* \details <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>λ<EFBFBD><CEBB>Ԫ<EFBFBD>ص<EFBFBD>ֱ<EFBFBD><D6B1>ָ<EFBFBD>롣
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>踴<EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD>
|
||||
* \warning <20><><EFBFBD>ص<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ڶ<EFBFBD><DAB6>нṹ<D0BD>ĺ<DEB8><C4BA><EFBFBD><EFBFBD><EFBFBD>ʧЧ<CAA7><D0A7>
|
||||
*/
|
||||
void* queue_data(queue queue, int index)
|
||||
{
|
||||
if (!queue) return 0;
|
||||
if (index < 0 || index >= queue->size) return 0; // <20><><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
return (void*)at((queue->head + index) % (queue->capacity));
|
||||
}
|
||||
119
usr/algo/algo_queue.h
Normal file
119
usr/algo/algo_queue.h
Normal file
@@ -0,0 +1,119 @@
|
||||
#ifndef _ALGO_QUEUE_H_
|
||||
#define _ALGO_QUEUE_H_
|
||||
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD> */
|
||||
typedef struct QUEUE
|
||||
{
|
||||
void* base; /* <20><><EFBFBD>ݴ洢<DDB4><E6B4A2><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD>ַ */
|
||||
int dsize; /* ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>صĴ<D8B5>С<EFBFBD><D0A1><EFBFBD>ֽڣ<D6BD> */
|
||||
int capacity; /* <20><><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
int size; /* <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
int head; /* <20><>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ԫ<EFBFBD>أ<EFBFBD> */
|
||||
int tail; /* <20><>β<EFBFBD><CEB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ã<EFBFBD> */
|
||||
} *queue; // <20><><EFBFBD><EFBFBD>queueΪָ<CEAA><D6B8><EFBFBD>ýṹ<C3BD><E1B9B9>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
/**
|
||||
* \brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* \param[in] type: <20><><EFBFBD><EFBFBD>Ԫ<EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* \param[in] capacity: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* \return <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ɵĶ<C9B5><C4B6>ж<EFBFBD><D0B6><EFBFBD>
|
||||
*
|
||||
* \note ʹ<>ø<EFBFBD><C3B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
|
||||
* \example queue(int, 10) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ10<31><30><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD>
|
||||
*/
|
||||
#define queue(type, capacity) (&(struct QUEUE){(type[capacity]){0},sizeof(type),capacity,0,0,0})
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
int queue_push(queue queue, void* data);
|
||||
int queue_push2(queue queue, void* data);
|
||||
int queue_pop(queue queue, void* data);
|
||||
int queue_insert(queue queue, int index, void* data);
|
||||
int queue_erase(queue queue, int index, void* data);
|
||||
void queue_clear(queue queue);
|
||||
void* queue_data(queue queue, int index);
|
||||
|
||||
/**
|
||||
* \brief <20><><EFBFBD>ʶ<EFBFBD><CAB6><EFBFBD>ָ<EFBFBD><D6B8>λ<EFBFBD>õ<EFBFBD>Ԫ<EFBFBD><D4AA>
|
||||
* \param[in] queue: <20><><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
|
||||
* \param[in] type: Ԫ<><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* \param[in] i: Ԫ<><D4AA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0-based<65><64>
|
||||
* \return ָ<><D6B8>Ԫ<EFBFBD>ص<EFBFBD><D8B5><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
|
||||
*
|
||||
* \example queue_at(q, int, 0) = 42; // <20><><EFBFBD>ö<EFBFBD><C3B6><EFBFBD>Ԫ<EFBFBD><D4AA>
|
||||
*/
|
||||
#define queue_at(queue, type, i) (*(type *)queue_data((queue),(i)))
|
||||
|
||||
/**
|
||||
* \brief <20>ڶ<EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
|
||||
* \param[in] queue: <20><><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
|
||||
* \param[in] data: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ<EFBFBD><D6B7>NULL<4C><4C>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>
|
||||
* \return <20><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>״̬<D7B4><CCAC>1<EFBFBD>ɹ<EFBFBD>/0ʧ<30>ܣ<EFBFBD>
|
||||
*/
|
||||
#define queue_push_front(queue, data) queue_insert((queue), 0, data)
|
||||
|
||||
/**
|
||||
* \brief <20>ڶ<EFBFBD>β<EFBFBD><CEB2><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
|
||||
* \param[in] queue: <20><><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
|
||||
* \param[in] data: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ<EFBFBD><D6B7>NULL<4C><4C>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>
|
||||
* \return <20><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>״̬<D7B4><CCAC>1<EFBFBD>ɹ<EFBFBD>/0ʧ<30>ܣ<EFBFBD>
|
||||
*/
|
||||
#define queue_push_back(queue, data) queue_push2((queue), data)
|
||||
|
||||
/**
|
||||
* \brief <20>Ӷ<EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
|
||||
* \param[in] queue: <20><><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
|
||||
* \param[out] data: <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĵ<DDB5>ַ<EFBFBD><D6B7>NULL<4C><4C>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD>棩
|
||||
* \return <20><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>״̬<D7B4><CCAC>1<EFBFBD>ɹ<EFBFBD>/0ʧ<30>ܣ<EFBFBD>
|
||||
*/
|
||||
#define queue_pop_front(queue, data) queue_pop((queue), data)
|
||||
|
||||
/**
|
||||
* \brief <20>Ӷ<EFBFBD>β<EFBFBD><CEB2><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
|
||||
* \param[in] queue: <20><><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
|
||||
* \param[out] data: <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĵ<DDB5>ַ<EFBFBD><D6B7>NULL<4C><4C>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD>棩
|
||||
* \return <20><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>״̬<D7B4><CCAC>1<EFBFBD>ɹ<EFBFBD>/0ʧ<30>ܣ<EFBFBD>
|
||||
*/
|
||||
#define queue_pop_back(queue, data) queue_erase((queue), (queue)->size - 1, data)
|
||||
|
||||
/**
|
||||
* \brief <20><>ȡ<EFBFBD><C8A1><EFBFBD>е<EFBFBD>ǰԪ<C7B0><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* \param[in] queue: <20><><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
|
||||
* \return <20><><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
#define queue_size(queue) ((queue)->size)
|
||||
|
||||
/**
|
||||
* \brief <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* \param[in] queue: <20><><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
|
||||
* \return <20><><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
#define queue_capacity(queue) ((queue)->capacity)
|
||||
|
||||
/**
|
||||
* \brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA>
|
||||
* \param[in] queue: <20><><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
|
||||
* \return 0<><30>ʾ<EFBFBD>ǿգ<C7BF><D5A3><EFBFBD>0<EFBFBD><30>ʾ<EFBFBD><CABE>
|
||||
*/
|
||||
#define queue_empty(queue) ((queue)->size == 0)
|
||||
|
||||
/**
|
||||
* \brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
||||
* \param[in] queue: <20><><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>
|
||||
* \return 0<><30>ʾδ<CABE><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
|
||||
*/
|
||||
#define queue_full(queue) ((queue)->size == (queue)->capacity)
|
||||
|
||||
/**
|
||||
* \brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ַ<EFBFBD><D6B7>װ
|
||||
* \param[in] type: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD>int/float<61>ȣ<EFBFBD>
|
||||
* \param[in] value: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
||||
* \return <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
*
|
||||
* \note <20><><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊָ<CEAA><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* \example queue_push(q, literal(int, 42));
|
||||
*/
|
||||
#ifndef literal
|
||||
#define literal(type, value) ((type[1]){value})
|
||||
#endif
|
||||
|
||||
#endif
|
||||
96
usr/app/GasData.c
Normal file
96
usr/app/GasData.c
Normal file
@@ -0,0 +1,96 @@
|
||||
#include "GasData.h"
|
||||
#include "stdio.h"
|
||||
#include "bsp_Print.h"
|
||||
|
||||
#include "dsp_Demod.h"
|
||||
|
||||
#include "bsp_TEC.h"
|
||||
#include "bsp_ADC.h"
|
||||
#include "laser.h"
|
||||
#include "algo_Laser.h"
|
||||
#include "bsp_Uart.h"
|
||||
#include "algo_Calib.h"
|
||||
#include "GasData.h"
|
||||
#include "algo_Filter.h"
|
||||
#include "dsp_Demod.h"
|
||||
#include "app.h"
|
||||
#include "bsp_Flash.h"
|
||||
#include "bsp_print.h"
|
||||
|
||||
|
||||
|
||||
static void GasData_Task(void);
|
||||
static char *GasData_GetName(u8 GasType);
|
||||
static char *GasData_GetUnit(u8 Unit);
|
||||
|
||||
GasData_t GasData=
|
||||
{
|
||||
.Task = GasData_Task,
|
||||
.GetName = GasData_GetName,
|
||||
.GetUnit = GasData_GetUnit,
|
||||
};
|
||||
|
||||
GasData_t *pGasData = &GasData;
|
||||
|
||||
static void GasData_Task(void)
|
||||
{
|
||||
// if(BSP_PRINT_CURDATA == bsp_Print_DataTyppe)
|
||||
// {
|
||||
// printf("R_AD,%u,Cal_AD,%u,M_AD,%u,C_AD,%u,C_Val,%d,Val,%d\n",
|
||||
// pGasData->Gas_1.R_AD,pGasData->Gas_1.R_AD_Cal,pGasData->Gas_1.Measur_AD,pGasData->Gas_1.Cali_AD,pGasData->Gas_1.Fac_Value,pGasData->Gas_1.Usr_Value);
|
||||
// }
|
||||
pGasData->Gas_1.Left = LaserSensor.SHG.Pix_Light_Max;
|
||||
pGasData->Gas_1.Mid = LaserSensor.SHG.Pix_Light_Min;
|
||||
pGasData->Gas_1.Light_AD = LaserSensor.ORI.Light_AD;
|
||||
pGasData->Gas_1.TempAD = ADC.AD[ADC_BOARD];
|
||||
pGasData->Gas_1.Temp = ADC.Value[ADC_BOARD] * 100;
|
||||
pGasData->Gas_1.TECAD = ADC.AD[ADC_TEC];
|
||||
pGasData->Gas_1.TECTemp = ADC.Value[ADC_TEC] * 100;
|
||||
pGasData->Gas_1.Slope = FilterMeasur.Slope;
|
||||
pGasData->Gas_1.FastFlag = FilterMeasur.FastFlag;
|
||||
|
||||
|
||||
if(BSP_PRINT_CURDATA == bsp_Print_DataTyppe)
|
||||
{
|
||||
printf("f2pp=%u,caliAD=%u,RRtestAD=%u,cr=%d,con=%d,Cz=%d,left=%u,mid=%u,light_AD=%u,T=%d,TAD=%u,TECTemp=%d,TECAD=%u,Slope=%f,Fast=%d\n",
|
||||
pGasData->Gas_1.Measur_AD, pGasData->Gas_1.Cali_AD, pGasData->Gas_1.R_AD_Cal,
|
||||
pGasData->Gas_1.R_Value, pGasData->Gas_1.Fac_Value, pGasData->Gas_1.Usr_Value,
|
||||
pGasData->Gas_1.Left, pGasData->Gas_1.Mid, pGasData->Gas_1.Light_AD,
|
||||
pGasData->Gas_1.Temp, pGasData->Gas_1.TempAD, pGasData->Gas_1.TECTemp, pGasData->Gas_1.TECAD,
|
||||
pGasData->Gas_1.Slope, pGasData->Gas_1.FastFlag
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
static char *GasData_GetName(u8 GasType)
|
||||
{
|
||||
switch(GasType)
|
||||
{
|
||||
case GASDATA_TYPE_CH4 : return "CH4 ";
|
||||
case GASDATA_TYPE_CO2 : return "CO2 ";
|
||||
case GASDATA_TYPE_CO : return "CO2 ";
|
||||
case GASDATA_TYPE_CnHm: return "CnHm";
|
||||
case GASDATA_TYPE_SO2 : return "SO2 ";
|
||||
case GASDATA_TYPE_H2S : return "H2S ";
|
||||
case GASDATA_TYPE_H2 : return "H2 ";
|
||||
case GASDATA_TYPE_O2 : return "O2 ";
|
||||
case GASDATA_TYPE_HF : return "HF ";
|
||||
case GASDATA_TYPE_NH3 : return "NH3 ";
|
||||
default : return "unknow";
|
||||
}
|
||||
}
|
||||
|
||||
static char *GasData_GetUnit(u8 Unit)
|
||||
{
|
||||
switch(Unit)
|
||||
{
|
||||
case GASDATA_UNIT_PPM : return "ppm ";
|
||||
case GASDATA_UNIT_MG_M3 : return "mg/m3";
|
||||
case GASDATA_UNIT_PERCENT : return "% ";
|
||||
case GASDATA_UNIT_M_S : return "m/s ";
|
||||
case GASDATA_UNIT_M3_H : return "m3/h ";
|
||||
default : return "unknow";
|
||||
}
|
||||
}
|
||||
67
usr/app/GasData.h
Normal file
67
usr/app/GasData.h
Normal file
@@ -0,0 +1,67 @@
|
||||
#ifndef _GASDATA_H_
|
||||
#define _GASDATA_H_
|
||||
|
||||
#include "main.h"
|
||||
|
||||
#define GASDATA_TYPE_CH4 (0x00)
|
||||
#define GASDATA_TYPE_CO2 (0x01)
|
||||
#define GASDATA_TYPE_CO (0x02)
|
||||
#define GASDATA_TYPE_CnHm (0x03)
|
||||
#define GASDATA_TYPE_SO2 (0x04)
|
||||
#define GASDATA_TYPE_H2S (0x05)
|
||||
#define GASDATA_TYPE_H2 (0x06)
|
||||
#define GASDATA_TYPE_O2 (0x07)
|
||||
#define GASDATA_TYPE_HF (0x1C)
|
||||
#define GASDATA_TYPE_NH3 (0x1D)
|
||||
|
||||
|
||||
#define GASDATA_UNIT_PPM (0)
|
||||
#define GASDATA_UNIT_MG_M3 (1)
|
||||
#define GASDATA_UNIT_PERCENT (2)
|
||||
#define GASDATA_UNIT_M_S (3)
|
||||
#define GASDATA_UNIT_M3_H (4)
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u8 GasType;
|
||||
u8 Uint;
|
||||
u8 Point;
|
||||
u16 Range;
|
||||
}GasData_Flash_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GasData_Flash_t FlashData; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ*/
|
||||
float Slope; /*б<><D0B1>*/
|
||||
|
||||
u8 FastFlag; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>־λ*/
|
||||
u16 Left,Mid; /*<2A>ҷ<EFBFBD>*/
|
||||
u16 Light_AD; /*<2A><EFBFBD><E2B9A6>*/
|
||||
u16 TempAD; /*<2A>¶<EFBFBD>AD*/
|
||||
s16 Temp; /*<2A>¶<EFBFBD>*/
|
||||
u16 TECAD; /*TEC AD*/
|
||||
s16 TECTemp; /*TEC <20>¶<EFBFBD>*/
|
||||
|
||||
|
||||
|
||||
u16 R_AD; /*ԭʼADֵ*/
|
||||
u16 R_AD_Cal; /*ԭʼADֵ*/
|
||||
u16 Cali_AD; /*Уʱ<D7BC><CAB1><EFBFBD>˲<EFBFBD>ADֵ*/
|
||||
u16 Measur_AD; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>˲<EFBFBD>ADֵ*/
|
||||
|
||||
s16 R_Value; /*<2A>˲<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>Ũ<EFBFBD><C5A8>*/
|
||||
s16 Fac_Value; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>Ũ<EFBFBD><C5A8>*/
|
||||
s16 Usr_Value; /*<2A>û<EFBFBD>У<D0A3><D7BC><EFBFBD><EFBFBD>Ũ<EFBFBD><C5A8>*/
|
||||
}GasDataClass_t;
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GasDataClass_t Gas_1,Gas_2;
|
||||
void (*Task)(void);
|
||||
char *(*GetName)(u8);
|
||||
char *(*GetUnit)(u8);
|
||||
}GasData_t;
|
||||
|
||||
extern GasData_t GasData;
|
||||
#endif
|
||||
62
usr/app/app.c
Normal file
62
usr/app/app.c
Normal file
@@ -0,0 +1,62 @@
|
||||
#include "app.h"
|
||||
#include "os_timer.h"
|
||||
#include "stdio.h"
|
||||
#include "bsp_Uart.h"
|
||||
#include "bsp_iap.h"
|
||||
|
||||
/*Э<><D0AD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
const char SwVersion[20] = "V0.001.0";
|
||||
|
||||
void TASK_Idle(void);
|
||||
void Task_10ms(void);
|
||||
void Task_50ms(void);
|
||||
void Task_100ms(void);
|
||||
void Task_200ms(void);
|
||||
void Task_500ms(void);
|
||||
void Task_1s(void);
|
||||
void Task_2s(void);
|
||||
|
||||
/******************************************
|
||||
* <20><><EFBFBD><EFBFBD>: AppInit
|
||||
* <20><><EFBFBD><EFBFBD>: <20><>ʼ<EFBFBD><CABC>
|
||||
* <20><><EFBFBD><EFBFBD>: <20><>
|
||||
* <20><><EFBFBD><EFBFBD>: <20><>
|
||||
* <20><><EFBFBD><EFBFBD>: <20><>
|
||||
******************************************/
|
||||
void App_Init(void)
|
||||
{
|
||||
OsTimer_Init(); /*<2A><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>*/
|
||||
|
||||
// COM_Uart1.Init(&COM_Uart1);
|
||||
COM_Uart2.Init(&COM_Uart2);
|
||||
iap.init();
|
||||
}
|
||||
|
||||
/******************************************
|
||||
* <20><><EFBFBD><EFBFBD>: App_Task
|
||||
* <20><><EFBFBD><EFBFBD>: <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD>: <20><>
|
||||
* <20><><EFBFBD><EFBFBD>: <20><>
|
||||
* <20><><EFBFBD><EFBFBD>: <20><>ѭ<EFBFBD><D1AD><EFBFBD>е<EFBFBD><D0B5><EFBFBD>
|
||||
******************************************/
|
||||
void App_Task(void)
|
||||
{
|
||||
if (TIME_TRUE == OsTimer_CheckTimeOut(OsTimeTick_10ms, osTime_MSecTick, 10))
|
||||
{
|
||||
OsTimeTick_10ms = osTime_MSecTick;
|
||||
Task_10ms();
|
||||
}
|
||||
TASK_Idle();
|
||||
}
|
||||
/*<2A><><EFBFBD><EFBFBD>ִ<EFBFBD>еĺ<D0B5><C4BA><EFBFBD>*/
|
||||
void TASK_Idle(void)
|
||||
{
|
||||
COM_Uart1.Rx_Task(&COM_Uart1);
|
||||
COM_Uart2.Rx_Task(&COM_Uart2);
|
||||
iap.task();
|
||||
}
|
||||
|
||||
void Task_10ms(void)
|
||||
{
|
||||
|
||||
}
|
||||
9
usr/app/app.h
Normal file
9
usr/app/app.h
Normal file
@@ -0,0 +1,9 @@
|
||||
#ifndef _APP_H_
|
||||
#define _APP_H_
|
||||
|
||||
extern const char SwVersion[20];
|
||||
|
||||
void App_Init(void);
|
||||
void App_Task(void);
|
||||
|
||||
#endif
|
||||
131
usr/app/laser.c
Normal file
131
usr/app/laser.c
Normal file
@@ -0,0 +1,131 @@
|
||||
#include "laser.h"
|
||||
|
||||
#include "algo_Laser.h"
|
||||
|
||||
#include "stdio.h"
|
||||
#include "string.h"
|
||||
#include "bsp_DriveWave.h"
|
||||
#include "bsp_ADS8864.h"
|
||||
#include "dsp_Demod.h"
|
||||
#include "wk_usart.h"
|
||||
#include "algo_Calib.h"
|
||||
#include "algo_Filter.h"
|
||||
#include "GasData.h"
|
||||
#include "proto_Transform.h"
|
||||
|
||||
/*<2A>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD> Ϊ2<CEAA><32>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD>*/
|
||||
#define LASER_SAMPLE_LSH (3U)
|
||||
#define LASER_SAMPLE_NUM (8)
|
||||
|
||||
/*<2A>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>*/
|
||||
static u32 Laser_WaveSample[DRIVEWAVE_VALID_NUM];
|
||||
static void Laser_Task(void);
|
||||
static void Laser_WaveIO_Int(void);
|
||||
static void Laser_Init(void);
|
||||
|
||||
Laser_t Laser =
|
||||
{
|
||||
.pWaveSample = Laser_WaveSample,
|
||||
.Init = Laser_Init,
|
||||
.WaveIO_Int = Laser_WaveIO_Int,
|
||||
.Task = Laser_Task,
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
/*<2A><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>*/
|
||||
void Laser_Sample_Start(void)
|
||||
{
|
||||
tmr_counter_value_set(TMR1,0);
|
||||
tmr_interrupt_enable(TMR1,TMR_OVF_INT,TRUE);
|
||||
tmr_counter_enable(TMR1,TRUE);
|
||||
}
|
||||
|
||||
static void Laser_Init(void)
|
||||
{
|
||||
Laser_Sample_Start();
|
||||
}
|
||||
|
||||
/*ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>*/
|
||||
void Laser_Sample_Stop(void)
|
||||
{
|
||||
tmr_counter_enable(TMR1,FALSE);
|
||||
tmr_interrupt_enable(TMR1,TMR_OVF_INT,FALSE);
|
||||
}
|
||||
|
||||
static void Laser_Task(void)
|
||||
{
|
||||
/*<2A>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
if(DriveWave.DriveCount >= LASER_SAMPLE_NUM)
|
||||
{
|
||||
u16 i;
|
||||
float x;
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD>*/
|
||||
for(i=0;i<DRIVEWAVE_VALID_NUM;i++)
|
||||
{
|
||||
Laser_WaveSample[i] >>= LASER_SAMPLE_LSH;
|
||||
Demod.inWave[i] = Laser_WaveSample[i];
|
||||
}
|
||||
|
||||
/*<2A>źŽ<C5BA><C5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
Demod.Task();
|
||||
/*<2A><><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><D8B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
LaserSensor.Calculate();
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD>*/
|
||||
GasData.Gas_1.R_AD = LaserSensor.SHG.PP_Ori;
|
||||
GasData.Gas_1.R_AD_Cal = LaserSensor.SHG.PP_CalLight;
|
||||
|
||||
LaserSensor.SHG.PP_MeasurAvg = FilterMeasur.FastFilter(&FilterMeasur,LaserSensor.SHG.PP_CalLight);
|
||||
GasData.Gas_1.Measur_AD = LaserSensor.SHG.PP_MeasurAvg;
|
||||
LaserSensor.SHG.PP_CalibAvg = FilterCalib.FastFilter(&FilterCalib,LaserSensor.SHG.PP_CalLight);
|
||||
GasData.Gas_1.Cali_AD = LaserSensor.SHG.PP_CalibAvg;
|
||||
|
||||
/*Ũ<>ȼ<EFBFBD><C8BC><EFBFBD>*/
|
||||
x = LaserSensor.SHG.PP_CalLight;
|
||||
GasData.Gas_1.R_Value = Calib.FacCalibCoeff[3] * x * x * x + Calib.FacCalibCoeff[2] * x * x + Calib.FacCalibCoeff[1] * x + Calib.FacCalibCoeff[0];
|
||||
|
||||
x = LaserSensor.SHG.PP_MeasurAvg;
|
||||
GasData.Gas_1.Fac_Value = Calib.FacCalibCoeff[3] * x * x * x + Calib.FacCalibCoeff[2] * x * x + Calib.FacCalibCoeff[1] * x + Calib.FacCalibCoeff[0];
|
||||
x = GasData.Gas_1.Fac_Value;
|
||||
GasData.Gas_1.Usr_Value = Calib.UsrCalibCoeff[0] * (x + Calib.UsrCalibCoeff[1]);
|
||||
GasData.Task();
|
||||
proto_Transform_Task();
|
||||
|
||||
memset(Laser_WaveSample,0,sizeof(Laser_WaveSample));
|
||||
/*<2A><><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>*/
|
||||
DriveWave.DriveCount = 0;
|
||||
Laser_Sample_Start();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*̽<><CCBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>80k<30>ж<EFBFBD>*/
|
||||
static void Laser_WaveIO_Int(void)
|
||||
{
|
||||
static u16 AD_index;
|
||||
u16 AD;
|
||||
|
||||
DriveWave.DacOut(AD_index);
|
||||
if(AD_index < DRIVEWAVE_VALID_NUM)
|
||||
{
|
||||
AD = ADS8864.ADRead();
|
||||
Laser_WaveSample[AD_index] += AD;
|
||||
}
|
||||
|
||||
if(DRIVEWAVE_NUM - 1 == AD_index)
|
||||
{
|
||||
AD_index = 0;
|
||||
DriveWave.DriveCount++;
|
||||
if(DriveWave.DriveCount >= LASER_SAMPLE_NUM)
|
||||
{
|
||||
/*ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>*/
|
||||
Laser_Sample_Stop();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
AD_index++;
|
||||
}
|
||||
}
|
||||
|
||||
18
usr/app/laser.h
Normal file
18
usr/app/laser.h
Normal file
@@ -0,0 +1,18 @@
|
||||
#ifndef _LASER_H_
|
||||
#define _LASER_H_
|
||||
|
||||
#include "main.h"
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u8 SampleCompleteFlag;
|
||||
u32 *pWaveSample;
|
||||
void (*Init)(void);
|
||||
void (*WaveIO_Int)(void);
|
||||
void (*Task)(void);
|
||||
|
||||
}Laser_t;
|
||||
|
||||
extern Laser_t Laser;
|
||||
#endif
|
||||
121
usr/app/os_timer.c
Normal file
121
usr/app/os_timer.c
Normal file
@@ -0,0 +1,121 @@
|
||||
#include "os_timer.h"
|
||||
|
||||
unsigned short osTime_MSecTick = 0; /*<2A>δ<EFBFBD>ʱ<EFBFBD><CAB1>*/
|
||||
unsigned short osTime_SecTick = 0;
|
||||
unsigned short osTime_10SecTick = 0; /*10s<30><73>һ<EFBFBD><D2BB> <20><><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>¼*/
|
||||
|
||||
static unsigned short osTimer_MSec1 = 0;
|
||||
static unsigned short osTimer_MSec2 = 0;
|
||||
|
||||
unsigned short OsTimeTick_10ms;
|
||||
unsigned short OsTimeTick_50ms;
|
||||
unsigned short OsTimeTick_100ms;
|
||||
unsigned short OsTimeTick_200ms;
|
||||
unsigned short OsTimeTick_500ms;
|
||||
unsigned short OsTimeTick_1s;
|
||||
unsigned short OsTimeTick_2s;
|
||||
|
||||
/****************************************************************************
|
||||
* NAME: OsTimer_Init
|
||||
* CALLED BY: Application
|
||||
* PRECONDITIONS:
|
||||
* INPUT PARAMETERS: None
|
||||
* RETURN VALUES: None
|
||||
* DESCRIPTION: OsTimer initialization
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void OsTimer_Init(void)
|
||||
{
|
||||
osTimer_MSec1 = 0;
|
||||
osTimer_MSec2 = 0;
|
||||
osTime_SecTick = 0;
|
||||
osTime_MSecTick = 0;
|
||||
|
||||
OsTimeTick_10ms = osTime_MSecTick;
|
||||
OsTimeTick_50ms = osTime_MSecTick;
|
||||
OsTimeTick_100ms = osTime_MSecTick;
|
||||
OsTimeTick_200ms = osTime_MSecTick;
|
||||
OsTimeTick_500ms = osTime_MSecTick;
|
||||
OsTimeTick_1s = osTime_MSecTick;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* NAME: OsTimer_Increment
|
||||
* CALLED BY: ISR
|
||||
* PRECONDITIONS:
|
||||
* INPUT PARAMETERS: msec - millisecond to increase
|
||||
* RETURN VALUES: None
|
||||
* DESCRIPTION: Increase the Timer
|
||||
*
|
||||
****************************************************************************/
|
||||
void OsTimer_Increment(unsigned short msec)
|
||||
{
|
||||
osTime_MSecTick += msec;
|
||||
osTimer_MSec1 += msec;
|
||||
osTimer_MSec2 += msec;
|
||||
if (osTimer_MSec1 >= 1000U) /*1s*/
|
||||
{
|
||||
osTimer_MSec1 = 0U;
|
||||
osTime_SecTick++;
|
||||
}
|
||||
if (osTimer_MSec2 >= 10000U) /*10s*/
|
||||
{
|
||||
osTimer_MSec2 = 0U;
|
||||
osTime_10SecTick++;
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* NAME: OsTimer_CheckTimeOut
|
||||
* CALLED BY: Application
|
||||
* PRECONDITIONS:
|
||||
* INPUT PARAMETERS: timeStart - start tick
|
||||
* timeNow - current tick
|
||||
* timeOut - expired tick
|
||||
* RETURN VALUES: whether timer is expired
|
||||
* DESCRIPTION: check if specified time is expired
|
||||
*
|
||||
****************************************************************************/
|
||||
unsigned char OsTimer_CheckTimeOut(unsigned short timeStart, unsigned short timeNow, unsigned short timeOut)
|
||||
{
|
||||
unsigned short timerActivateVal;
|
||||
timerActivateVal = timeOut + timeStart;
|
||||
|
||||
if (timerActivateVal > timeStart)
|
||||
{
|
||||
if ((timeNow >= timerActivateVal) || (timeNow < timeStart))
|
||||
{
|
||||
return TIME_TRUE;
|
||||
}
|
||||
}
|
||||
else if ((timeNow >= timerActivateVal) && (timeNow < timeStart))
|
||||
{
|
||||
return TIME_TRUE;
|
||||
}
|
||||
return TIME_FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>OsTimer_CheckTimeOut<75><74><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
|
||||
*/
|
||||
unsigned short OsTimer_CheckRunTime(unsigned short timeStart, unsigned short timeNow, unsigned short timeOut)
|
||||
{
|
||||
unsigned short timerActivateVal;
|
||||
timerActivateVal = timeOut + timeStart;
|
||||
|
||||
if (timerActivateVal > timeStart)
|
||||
{
|
||||
return (timerActivateVal - timeNow);
|
||||
}
|
||||
else
|
||||
{
|
||||
return (65535U - timeNow + timerActivateVal);
|
||||
}
|
||||
}
|
||||
|
||||
/*<2A><><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD>ʱ*/
|
||||
void Delay_ms(unsigned short delay)
|
||||
{
|
||||
HAL_Delay(delay);
|
||||
}
|
||||
29
usr/app/os_timer.h
Normal file
29
usr/app/os_timer.h
Normal file
@@ -0,0 +1,29 @@
|
||||
#ifndef _OSTIMER_H_
|
||||
#define _OSTIMER_H_
|
||||
|
||||
#include "main.h"
|
||||
|
||||
#define TIME_TRUE 1U
|
||||
#define TIME_FALSE 0U
|
||||
|
||||
|
||||
extern unsigned short osTime_MSecTick;
|
||||
extern unsigned short osTime_SecTick;
|
||||
extern unsigned short osTime_10SecTick; // 10s<30><73>һ<EFBFBD><D2BB> <20><><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>¼
|
||||
|
||||
extern unsigned short OsTimeTick_10ms;
|
||||
extern unsigned short OsTimeTick_50ms;
|
||||
extern unsigned short OsTimeTick_100ms;
|
||||
extern unsigned short OsTimeTick_200ms;
|
||||
extern unsigned short OsTimeTick_500ms;
|
||||
extern unsigned short OsTimeTick_1s;
|
||||
extern unsigned short OsTimeTick_2s;
|
||||
|
||||
void OsTimer_Init(void);
|
||||
void OsTimer_Increment(unsigned short msec);
|
||||
unsigned char OsTimer_CheckTimeOut(unsigned short timeStart, unsigned short timeNow, unsigned short timeOut);
|
||||
unsigned short OsTimer_CheckRunTime(unsigned short timeStart, unsigned short timeNow, unsigned short timeOut);
|
||||
|
||||
void Delay_ms(unsigned short delay);
|
||||
|
||||
#endif
|
||||
14
usr/app/usr_config.h
Normal file
14
usr/app/usr_config.h
Normal file
@@ -0,0 +1,14 @@
|
||||
#ifndef _USR_CONFIG_H_
|
||||
#define _USR_CONFIG_H_
|
||||
|
||||
#define USR_TRUE (1U)
|
||||
#define USR_FALSE (0U)
|
||||
|
||||
#define USR_ENABLE (1U)
|
||||
#define USR_DISENABLE (0U)
|
||||
|
||||
|
||||
#define U64_MAX (0xffffffffffffffff)
|
||||
#define U32_MAX (0xffffffff)
|
||||
#define U16_MAX (0xffff)
|
||||
#endif
|
||||
247
usr/bsp/bsp_DS1302.c
Normal file
247
usr/bsp/bsp_DS1302.c
Normal file
@@ -0,0 +1,247 @@
|
||||
#include "bsp_DS1302.h"
|
||||
|
||||
#define bsp_DS1302_DELAY() do{ \
|
||||
__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();\
|
||||
}while(0)
|
||||
|
||||
#define RST_CLR HAL_GPIO_WritePin(DS1302_RST_GPIO_Port, DS1302_RST_Pin, GPIO_PIN_RESET )
|
||||
#define RST_SET HAL_GPIO_WritePin(DS1302_RST_GPIO_Port, DS1302_RST_Pin, GPIO_PIN_SET )
|
||||
|
||||
#define IO_CLR HAL_GPIO_WritePin(DS1302_DIO_GPIO_Port, DS1302_DIO_Pin, GPIO_PIN_RESET )
|
||||
#define IO_SET HAL_GPIO_WritePin(DS1302_DIO_GPIO_Port, DS1302_DIO_Pin, GPIO_PIN_SET )
|
||||
#define IO_READ HAL_GPIO_ReadPin (DS1302_DIO_GPIO_Port, DS1302_DIO_Pin )
|
||||
|
||||
#define SCK_CLR HAL_GPIO_WritePin(DS1302_CLK_GPIO_Port, DS1302_CLK_Pin, GPIO_PIN_RESET )
|
||||
#define SCK_SET HAL_GPIO_WritePin(DS1302_CLK_GPIO_Port, DS1302_CLK_Pin, GPIO_PIN_SET )
|
||||
|
||||
static void bsp_DS1302Init(void);
|
||||
static void bsp_DS1302_Task(void);
|
||||
static u8 bsp_DS1302_Set(bsp_DS1302_Time_t *pTime);
|
||||
|
||||
bsp_DS1302_t DS1302 =
|
||||
{
|
||||
.Init = bsp_DS1302Init,
|
||||
.Task = bsp_DS1302_Task,
|
||||
.Set = bsp_DS1302_Set,
|
||||
};
|
||||
|
||||
bsp_DS1302_t *pDS1302 = &DS1302;
|
||||
|
||||
static void bsp_DS1302DataInput(void)
|
||||
{
|
||||
GPIO_InitTypeDef GPIO_InitStruct; //<2F><><EFBFBD><EFBFBD>GPIO<49>ṹ<EFBFBD><E1B9B9>
|
||||
|
||||
GPIO_InitStruct.Pin = DS1302_DIO_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
||||
HAL_GPIO_Init(DS1302_DIO_GPIO_Port, &GPIO_InitStruct);
|
||||
}
|
||||
|
||||
static void bsp_DS1302DataOutput(void)
|
||||
{
|
||||
GPIO_InitTypeDef GPIO_InitStruct; //<2F><><EFBFBD><EFBFBD>GPIO<49>ṹ<EFBFBD><E1B9B9>
|
||||
|
||||
GPIO_InitStruct.Pin = DS1302_DIO_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
||||
HAL_GPIO_Init(DS1302_DIO_GPIO_Port, &GPIO_InitStruct);
|
||||
}
|
||||
|
||||
/*<2A><>bsp_DS1302д<32><D0B4>һ<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
static void bsp_DS1302_write_byte(u8 Addr, u8 Data)
|
||||
{
|
||||
u8 i;
|
||||
RST_SET; /*<2A><><EFBFBD><EFBFBD>bsp_DS1302<30><32><EFBFBD><EFBFBD>*/
|
||||
|
||||
bsp_DS1302_DELAY();
|
||||
/*д<><D0B4>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>addr*/
|
||||
Addr = Addr & 0xFE;/*<2A><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>*/
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
if (Addr & 0x01)
|
||||
{
|
||||
IO_SET;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
IO_CLR;
|
||||
}
|
||||
|
||||
bsp_DS1302_DELAY();
|
||||
SCK_SET;
|
||||
bsp_DS1302_DELAY();
|
||||
SCK_CLR;
|
||||
bsp_DS1302_DELAY();
|
||||
Addr = Addr >> 1;
|
||||
}
|
||||
|
||||
/*д<><D0B4><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>d*/
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
if (Data & 0x01)
|
||||
{
|
||||
IO_SET;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
IO_CLR;
|
||||
}
|
||||
|
||||
bsp_DS1302_DELAY();
|
||||
SCK_SET;
|
||||
bsp_DS1302_DELAY();
|
||||
SCK_CLR;
|
||||
bsp_DS1302_DELAY();
|
||||
Data = Data >> 1;
|
||||
}
|
||||
|
||||
RST_CLR; /*ֹͣbsp_DS1302<30><32><EFBFBD><EFBFBD>*/
|
||||
bsp_DS1302_DELAY();
|
||||
}
|
||||
|
||||
/*<2A><>bsp_DS1302<30><32><EFBFBD><EFBFBD>һ<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
static u8 bsp_DS1302_read_byte(u8 Addr)
|
||||
{
|
||||
u8 i;
|
||||
u8 temp;
|
||||
RST_SET; /*<2A><><EFBFBD><EFBFBD>bsp_DS1302<30><32><EFBFBD><EFBFBD>*/
|
||||
bsp_DS1302_DELAY();
|
||||
|
||||
/*д<><D0B4>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>addr*/
|
||||
Addr = Addr | 0x01;/*<2A><><EFBFBD><EFBFBD>λ<EFBFBD>ø<EFBFBD>*/
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
if (Addr & 0x01)
|
||||
{
|
||||
IO_SET;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
IO_CLR;
|
||||
}
|
||||
|
||||
bsp_DS1302_DELAY();
|
||||
SCK_SET;
|
||||
bsp_DS1302_DELAY();
|
||||
SCK_CLR;
|
||||
bsp_DS1302_DELAY();
|
||||
Addr = Addr >> 1;
|
||||
}
|
||||
|
||||
bsp_DS1302DataInput();
|
||||
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>temp*/
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
temp = temp >> 1;
|
||||
|
||||
if (IO_READ)
|
||||
{
|
||||
temp |= 0x80;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
temp &= 0x7F;
|
||||
}
|
||||
|
||||
bsp_DS1302_DELAY();
|
||||
SCK_SET;
|
||||
bsp_DS1302_DELAY();
|
||||
SCK_CLR;
|
||||
bsp_DS1302_DELAY();
|
||||
}
|
||||
|
||||
RST_CLR; /*ֹͣbsp_DS1302<30><32><EFBFBD><EFBFBD>*/
|
||||
bsp_DS1302_DELAY();
|
||||
bsp_DS1302DataOutput();
|
||||
return temp;
|
||||
}
|
||||
|
||||
static u8 HexToBCD(u8 code)
|
||||
{
|
||||
u8 temp;
|
||||
temp = ((code / 10) << 4) + (code % 10);
|
||||
return temp;
|
||||
}
|
||||
|
||||
static u8 bsp_DS1302_Set(bsp_DS1302_Time_t *pTime)
|
||||
{
|
||||
if ((pTime->Year > 99) || (pTime->Month > 12) || (pTime->Day > 31) ||
|
||||
(pTime->Hour > 23) || (pTime->Minute > 59) || (pTime->Second > 59))
|
||||
{
|
||||
return USR_FALSE;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
bsp_DS1302_write_byte(BSP_DS1302_CONTROL_ADDR, 0x00); //<2F>ر<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
|
||||
bsp_DS1302_write_byte(BSP_DS1302_SEC_ADDR, 0x80); //<2F><>ͣ
|
||||
|
||||
bsp_DS1302_write_byte(BSP_DS1302_YEAR_ADDR, HexToBCD(pTime->Year));
|
||||
bsp_DS1302_write_byte(BSP_DS1302_MONTH_ADDR, HexToBCD(pTime->Month));
|
||||
bsp_DS1302_write_byte(BSP_DS1302_DATA_ADDR, HexToBCD(pTime->Day));
|
||||
bsp_DS1302_write_byte(BSP_DS1302_HOUR_ADDR, HexToBCD(pTime->Hour));
|
||||
bsp_DS1302_write_byte(BSP_DS1302_MIN_ADDR, HexToBCD(pTime->Minute));
|
||||
bsp_DS1302_write_byte(BSP_DS1302_SEC_ADDR, HexToBCD(pTime->Second));
|
||||
|
||||
bsp_DS1302_write_byte(BSP_DS1302_CONTROL_ADDR, 0x80); //<2F><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
|
||||
return USR_TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
static void bsp_DS1302_Task(void)
|
||||
{
|
||||
u8 RegData;
|
||||
|
||||
RegData = bsp_DS1302_read_byte(BSP_DS1302_YEAR_ADDR);
|
||||
pDS1302->Time.Year = (RegData / 16) * 10 + RegData % 16;
|
||||
|
||||
RegData = bsp_DS1302_read_byte(BSP_DS1302_MONTH_ADDR);
|
||||
pDS1302->Time.Month = (RegData / 16) * 10 + RegData % 16;
|
||||
|
||||
RegData = bsp_DS1302_read_byte(BSP_DS1302_DATA_ADDR);
|
||||
pDS1302->Time.Day = (RegData / 16) * 10 + RegData % 16;
|
||||
|
||||
RegData = bsp_DS1302_read_byte(BSP_DS1302_HOUR_ADDR);
|
||||
pDS1302->Time.Hour = (RegData / 16) * 10 + RegData % 16;
|
||||
|
||||
RegData = bsp_DS1302_read_byte(BSP_DS1302_MIN_ADDR);
|
||||
pDS1302->Time.Minute = (RegData / 16) * 10 + RegData % 16;
|
||||
|
||||
RegData = bsp_DS1302_read_byte(BSP_DS1302_SEC_ADDR);
|
||||
pDS1302->Time.Second = (RegData / 16) * 10 + RegData % 16;
|
||||
|
||||
}
|
||||
|
||||
static void bsp_DS1302Init(void)
|
||||
{
|
||||
RST_SET;
|
||||
SCK_CLR;
|
||||
bsp_DS1302_Task();
|
||||
|
||||
if ((pDS1302->Time.Year > 99) || (pDS1302->Time.Month > 12) || (pDS1302->Time.Day > 31) ||
|
||||
(pDS1302->Time.Hour > 23) || (pDS1302->Time.Minute > 59) || (pDS1302->Time.Second > 59))
|
||||
{
|
||||
pDS1302->Time.Year = 25;
|
||||
pDS1302->Time.Month = 1;
|
||||
pDS1302->Time.Day = 1;
|
||||
pDS1302->Time.Hour = 0;
|
||||
pDS1302->Time.Minute = 0;
|
||||
pDS1302->Time.Second = 0;
|
||||
bsp_DS1302_Set(&pDS1302->Time);
|
||||
}
|
||||
}
|
||||
206
usr/bsp/bsp_DS1302.c.orig
Normal file
206
usr/bsp/bsp_DS1302.c.orig
Normal file
@@ -0,0 +1,206 @@
|
||||
#include "bsp_DS1302.h"
|
||||
|
||||
#define bsp_DS1302_DELAY() do{ \
|
||||
__NOP();__NOP();__NOP();__NOP();\
|
||||
__NOP();__NOP();__NOP();__NOP();\
|
||||
__NOP();__NOP();__NOP();__NOP();\
|
||||
__NOP();__NOP();__NOP();__NOP();\
|
||||
__NOP();__NOP();__NOP();__NOP();\
|
||||
}while(0)
|
||||
|
||||
|
||||
#define RST_CLR HAL_GPIO_WritePin(DS1302_RST_GPIO_Port, DS1302_RST_Pin, GPIO_PIN_RESET )
|
||||
#define RST_SET HAL_GPIO_WritePin(DS1302_RST_GPIO_Port, DS1302_RST_Pin, GPIO_PIN_SET )
|
||||
|
||||
#define IO_CLR HAL_GPIO_WritePin(DS1302_DIO_GPIO_Port, DS1302_DIO_Pin, GPIO_PIN_RESET )
|
||||
#define IO_SET HAL_GPIO_WritePin(DS1302_DIO_GPIO_Port, DS1302_DIO_Pin, GPIO_PIN_SET )
|
||||
#define IO_READ HAL_GPIO_ReadPin (DS1302_DIO_GPIO_Port, DS1302_DIO_Pin )
|
||||
|
||||
#define SCK_CLR HAL_GPIO_WritePin(DS1302_CLK_GPIO_Port, DS1302_CLK_Pin, GPIO_PIN_RESET )
|
||||
#define SCK_SET HAL_GPIO_WritePin(DS1302_CLK_GPIO_Port, DS1302_CLK_Pin, GPIO_PIN_SET )
|
||||
|
||||
static void bsp_DS1302Init(void);
|
||||
static void bsp_DS1302_Task(void);
|
||||
static void bsp_DS1302_Set(bsp_DS1302_Time_t *pTime);
|
||||
|
||||
|
||||
bsp_DS1302_t DS1302 =
|
||||
{
|
||||
.Init = bsp_DS1302Init,
|
||||
.Task = bsp_DS1302_Task,
|
||||
.Set = bsp_DS1302_Set,
|
||||
};
|
||||
|
||||
|
||||
bsp_DS1302_t *pDS1302 = &DS1302;
|
||||
|
||||
static void bsp_DS1302DataInput(void)
|
||||
{
|
||||
GPIO_InitTypeDef GPIO_InitStruct; //<2F><><EFBFBD><EFBFBD>GPIO<49>ṹ<EFBFBD><E1B9B9>
|
||||
|
||||
GPIO_InitStruct.Pin = DS1302_DIO_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
||||
HAL_GPIO_Init(DS1302_DIO_GPIO_Port, &GPIO_InitStruct);
|
||||
}
|
||||
|
||||
static void bsp_DS1302DataOutput(void)
|
||||
{
|
||||
GPIO_InitTypeDef GPIO_InitStruct; //<2F><><EFBFBD><EFBFBD>GPIO<49>ṹ<EFBFBD><E1B9B9>
|
||||
|
||||
GPIO_InitStruct.Pin = DS1302_DIO_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
||||
HAL_GPIO_Init(DS1302_DIO_GPIO_Port, &GPIO_InitStruct);
|
||||
}
|
||||
|
||||
/*<2A><>bsp_DS1302д<32><D0B4>һ<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
static void bsp_DS1302_write_byte(u8 Addr, u8 Data)
|
||||
{
|
||||
u8 i;
|
||||
RST_SET; /*<2A><><EFBFBD><EFBFBD>bsp_DS1302<30><32><EFBFBD><EFBFBD>*/
|
||||
|
||||
bsp_DS1302_DELAY();
|
||||
/*д<><D0B4>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>addr*/
|
||||
Addr = Addr & 0xFE;/*<2A><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>*/
|
||||
for(i=0; i<8; i++){
|
||||
if(Addr&0x01) IO_SET;
|
||||
else IO_CLR;
|
||||
bsp_DS1302_DELAY();
|
||||
SCK_SET;
|
||||
bsp_DS1302_DELAY();
|
||||
SCK_CLR;
|
||||
bsp_DS1302_DELAY();
|
||||
Addr = Addr >> 1;
|
||||
}
|
||||
|
||||
/*д<><D0B4><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>d*/
|
||||
for(i=0; i<8; i++){
|
||||
if(Data&0x01) IO_SET;
|
||||
else IO_CLR;
|
||||
bsp_DS1302_DELAY();
|
||||
SCK_SET;
|
||||
bsp_DS1302_DELAY();
|
||||
SCK_CLR;
|
||||
bsp_DS1302_DELAY();
|
||||
Data = Data >> 1;
|
||||
}
|
||||
RST_CLR; /*ֹͣbsp_DS1302<30><32><EFBFBD><EFBFBD>*/
|
||||
bsp_DS1302_DELAY();
|
||||
}
|
||||
|
||||
/*<2A><>bsp_DS1302<30><32><EFBFBD><EFBFBD>һ<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
static u8 bsp_DS1302_read_byte(u8 Addr)
|
||||
{
|
||||
u8 i;
|
||||
u8 temp;
|
||||
RST_SET; /*<2A><><EFBFBD><EFBFBD>bsp_DS1302<30><32><EFBFBD><EFBFBD>*/
|
||||
bsp_DS1302_DELAY();
|
||||
|
||||
/*д<><D0B4>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>addr*/
|
||||
Addr = Addr | 0x01;/*<2A><><EFBFBD><EFBFBD>λ<EFBFBD>ø<EFBFBD>*/
|
||||
for(i=0; i<8; i++)
|
||||
{
|
||||
if(Addr&0x01)
|
||||
{
|
||||
IO_SET;
|
||||
}
|
||||
else
|
||||
{
|
||||
IO_CLR;
|
||||
}
|
||||
bsp_DS1302_DELAY();
|
||||
SCK_SET;
|
||||
bsp_DS1302_DELAY();
|
||||
SCK_CLR;
|
||||
bsp_DS1302_DELAY();
|
||||
Addr = Addr >> 1;
|
||||
}
|
||||
|
||||
bsp_DS1302DataInput();
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>temp*/
|
||||
for(i=0; i<8; i++)
|
||||
{
|
||||
temp = temp>>1;
|
||||
if(IO_READ) temp |= 0x80;
|
||||
else temp&=0x7F;
|
||||
bsp_DS1302_DELAY();
|
||||
SCK_SET;
|
||||
bsp_DS1302_DELAY();
|
||||
SCK_CLR;
|
||||
bsp_DS1302_DELAY();
|
||||
}
|
||||
RST_CLR; /*ֹͣbsp_DS1302<30><32><EFBFBD><EFBFBD>*/
|
||||
bsp_DS1302_DELAY();
|
||||
bsp_DS1302DataOutput();
|
||||
return temp;
|
||||
}
|
||||
|
||||
static u8 HexToBCD(u8 code)
|
||||
{
|
||||
u8 temp;
|
||||
temp = ((code / 10)<<4)+(code % 10);
|
||||
return temp;
|
||||
}
|
||||
|
||||
static void bsp_DS1302_Set(bsp_DS1302_Time_t *pTime)
|
||||
{
|
||||
bsp_DS1302_write_byte(BSP_DS1302_CONTROL_ADDR,0x00); //<2F>ر<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
|
||||
bsp_DS1302_write_byte(BSP_DS1302_SEC_ADDR,0x80); //<2F><>ͣ
|
||||
|
||||
bsp_DS1302_write_byte(BSP_DS1302_YEAR_ADDR, HexToBCD(pTime->Year));
|
||||
bsp_DS1302_write_byte(BSP_DS1302_MONTH_ADDR, HexToBCD(pTime->Month));
|
||||
bsp_DS1302_write_byte(BSP_DS1302_DATA_ADDR, HexToBCD(pTime->Day));
|
||||
bsp_DS1302_write_byte(BSP_DS1302_HOUR_ADDR, HexToBCD(pTime->Hour));
|
||||
bsp_DS1302_write_byte(BSP_DS1302_MIN_ADDR, HexToBCD(pTime->Minute));
|
||||
bsp_DS1302_write_byte(BSP_DS1302_SEC_ADDR, HexToBCD(pTime->Second));
|
||||
|
||||
bsp_DS1302_write_byte(BSP_DS1302_CONTROL_ADDR,0x80); //<2F><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
|
||||
}
|
||||
|
||||
static void bsp_DS1302_Task(void)
|
||||
{
|
||||
u8 RegData;
|
||||
|
||||
RegData = bsp_DS1302_read_byte(BSP_DS1302_YEAR_ADDR);
|
||||
pDS1302->Time.Year = (RegData/16)*10 + RegData%16;
|
||||
|
||||
RegData = bsp_DS1302_read_byte(BSP_DS1302_MONTH_ADDR);
|
||||
pDS1302->Time.Month = (RegData/16)*10 + RegData%16;
|
||||
|
||||
RegData = bsp_DS1302_read_byte(BSP_DS1302_DATA_ADDR);
|
||||
pDS1302->Time.Day = (RegData/16)*10 + RegData%16;
|
||||
|
||||
RegData = bsp_DS1302_read_byte(BSP_DS1302_HOUR_ADDR);
|
||||
pDS1302->Time.Hour = (RegData/16)*10 + RegData%16;
|
||||
|
||||
RegData = bsp_DS1302_read_byte(BSP_DS1302_MIN_ADDR);
|
||||
pDS1302->Time.Minute = (RegData/16)*10 + RegData%16;
|
||||
|
||||
RegData = bsp_DS1302_read_byte(BSP_DS1302_SEC_ADDR);
|
||||
pDS1302->Time.Second = (RegData/16)*10 + RegData%16;
|
||||
|
||||
}
|
||||
|
||||
static void bsp_DS1302Init(void)
|
||||
{
|
||||
RST_SET;
|
||||
SCK_CLR;
|
||||
bsp_DS1302_Task();
|
||||
if((pDS1302->Time.Year>99)||(pDS1302->Time.Month>12)||(pDS1302->Time.Day>31)||
|
||||
(pDS1302->Time.Hour>23)||(pDS1302->Time.Minute>59)||(pDS1302->Time.Second>59))
|
||||
{
|
||||
pDS1302->Time.Year = 25;
|
||||
pDS1302->Time.Month = 1;
|
||||
pDS1302->Time.Day = 1;
|
||||
pDS1302->Time.Hour = 0;
|
||||
pDS1302->Time.Minute = 0;
|
||||
pDS1302->Time.Second = 0;
|
||||
bsp_DS1302_Set(&pDS1302->Time);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
37
usr/bsp/bsp_DS1302.h
Normal file
37
usr/bsp/bsp_DS1302.h
Normal file
@@ -0,0 +1,37 @@
|
||||
#ifndef __BSP_DS1302_H__
|
||||
#define __BSP_DS1302_H__
|
||||
|
||||
#include "main.h"
|
||||
|
||||
#define BSP_DS1302_SEC_ADDR 0x80 //<2F><><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
|
||||
#define BSP_DS1302_MIN_ADDR 0x82 //<2F><><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
|
||||
#define BSP_DS1302_HOUR_ADDR 0x84 //ʱ<><CAB1><EFBFBD>ݵ<EFBFBD>ַ
|
||||
#define BSP_DS1302_DATA_ADDR 0x86 //<2F><><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
|
||||
#define BSP_DS1302_MONTH_ADDR 0x88 //<2F><><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
|
||||
#define BSP_DS1302_DAY_ADDR 0x8a //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
|
||||
#define BSP_DS1302_YEAR_ADDR 0x8c //<2F><><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
|
||||
#define BSP_DS1302_CONTROL_ADDR 0x8e //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
|
||||
#define BSP_DS1302_CHARGER_ADDR 0x90
|
||||
#define BSP_DS1302_CLKBURST_ADDR 0xbe
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u16 Year;
|
||||
u8 Month;
|
||||
u8 Day;
|
||||
u8 Hour;
|
||||
u8 Minute;
|
||||
u8 Second;
|
||||
}bsp_DS1302_Time_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
bsp_DS1302_Time_t Time;
|
||||
void (*Init)(void);
|
||||
u8 (*Set)(bsp_DS1302_Time_t *);
|
||||
void (*Task)(void);
|
||||
}bsp_DS1302_t;
|
||||
|
||||
extern bsp_DS1302_t DS1302;//ϵͳʱ<CDB3><CAB1>
|
||||
|
||||
#endif
|
||||
1
usr/bsp/bsp_Delay.c
Normal file
1
usr/bsp/bsp_Delay.c
Normal file
@@ -0,0 +1 @@
|
||||
#include "bsp_Delay.h"
|
||||
6
usr/bsp/bsp_Delay.h
Normal file
6
usr/bsp/bsp_Delay.h
Normal file
@@ -0,0 +1,6 @@
|
||||
#ifndef _BSP_DELAY_H_
|
||||
#define _BSP_DELAY_H_
|
||||
|
||||
#include "main.h"
|
||||
|
||||
#endif
|
||||
248
usr/bsp/bsp_Flash.c
Normal file
248
usr/bsp/bsp_Flash.c
Normal file
@@ -0,0 +1,248 @@
|
||||
#include "bsp_Flash.h"
|
||||
#include "string.h"
|
||||
#include "bsp_Wdg.h"
|
||||
#include "bsp_W5500.h"
|
||||
#include "proto_HSMS.h"
|
||||
/* FLASH Memory Definitions */
|
||||
#define BSP_FLASH_SIZE (0x10000UL)
|
||||
#define BSP_FLASH_PAGE_SIZE (FLASH_PAGE_SIZE)
|
||||
#define BSP_FLASH_PAGE_NUM (BSP_FLASH_SIZE/BSP_FLASH_PAGE_SIZE)
|
||||
|
||||
#define BSP_FLASH_ADDR_RW(n) ((uint32_t)(FLASH_BASE + (BSP_FLASH_PAGE_NUM - (n)) * BSP_FLASH_PAGE_SIZE))
|
||||
#define BSP_FLASH_DATASAVE_ADDR BSP_FLASH_ADDR_RW(1)
|
||||
|
||||
static void bsp_Flash_Init(void);
|
||||
static void bsp_FlashDataWrite(void);
|
||||
static void bsp_FlashDataRead(void);
|
||||
static void bsp_FlashReset(void);
|
||||
|
||||
bsp_Flash_t Usr_Flash =
|
||||
{
|
||||
.Init = bsp_Flash_Init,
|
||||
.Write = bsp_FlashDataWrite,
|
||||
.Read = bsp_FlashDataRead,
|
||||
.Reset = bsp_FlashReset,
|
||||
};
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ҳ
|
||||
static HAL_StatusTypeDef bsp_FLASH_ErasePage(uint32_t PageAddress)
|
||||
{
|
||||
FLASH_EraseInitTypeDef EraseInitStruct;
|
||||
uint32_t PageError = 0;
|
||||
|
||||
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
|
||||
EraseInitStruct.PageAddress = PageAddress;
|
||||
EraseInitStruct.NbPages = 1;
|
||||
|
||||
return HAL_FLASHEx_Erase(&EraseInitStruct, &PageError);
|
||||
}
|
||||
|
||||
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD> - <20><>32λ<32><CEBB>ȡ
|
||||
static void bsp_Flash_STMFLASH_Read(uint32_t ReadAddr, void *pBuffer, uint32_t size)
|
||||
{
|
||||
uint8_t *pBuf = (uint8_t*)pBuffer;
|
||||
uint32_t *addr = (uint32_t*)ReadAddr;
|
||||
uint32_t words = size / 4;
|
||||
uint32_t bytes_remaining = size % 4;
|
||||
|
||||
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>32λ<32><CEBB>
|
||||
for(uint32_t i = 0; i < words; i++)
|
||||
{
|
||||
*((uint32_t*)pBuf) = addr[i];
|
||||
pBuf += 4;
|
||||
}
|
||||
|
||||
// <20><>ȡʣ<C8A1><CAA3><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
|
||||
if(bytes_remaining > 0)
|
||||
{
|
||||
uint32_t last_word = addr[words];
|
||||
uint8_t *last_bytes = (uint8_t*)&last_word;
|
||||
|
||||
for(uint32_t i = 0; i < bytes_remaining; i++)
|
||||
{
|
||||
pBuf[i] = last_bytes[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><>32λд<CEBB><D0B4>
|
||||
static HAL_StatusTypeDef bsp_Flash_STMFLASH_Write(uint32_t WriteAddr, void *pBuffer, uint32_t size)
|
||||
{
|
||||
HAL_StatusTypeDef status = HAL_OK;
|
||||
uint8_t *pBuf = (uint8_t*)pBuffer;
|
||||
uint32_t words = size / 4;
|
||||
uint32_t bytes_remaining = size % 4;
|
||||
uint32_t current_addr = WriteAddr;
|
||||
|
||||
HAL_FLASH_Unlock();
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF>ҳ
|
||||
status = bsp_FLASH_ErasePage(WriteAddr);
|
||||
if(status != HAL_OK)
|
||||
{
|
||||
HAL_FLASH_Lock();
|
||||
return status;
|
||||
}
|
||||
|
||||
// д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>32λ<32><CEBB>
|
||||
for(uint32_t i = 0; i < words; i++)
|
||||
{
|
||||
status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,
|
||||
current_addr,
|
||||
*((uint32_t*)pBuf));
|
||||
if(status != HAL_OK) break;
|
||||
|
||||
current_addr += 4;
|
||||
pBuf += 4;
|
||||
}
|
||||
|
||||
// д<><D0B4>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
|
||||
if(status == HAL_OK && bytes_remaining > 0)
|
||||
{
|
||||
uint32_t last_word = 0xFFFFFFFF; // Ĭ<><C4AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0xFF
|
||||
uint8_t *last_bytes = (uint8_t*)&last_word;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
for(uint32_t i = 0; i < bytes_remaining; i++)
|
||||
{
|
||||
last_bytes[i] = pBuf[i];
|
||||
}
|
||||
|
||||
status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, current_addr, last_word);
|
||||
}
|
||||
|
||||
HAL_FLASH_Lock();
|
||||
return status;
|
||||
}
|
||||
|
||||
static void bsp_FlashReset(void)
|
||||
{
|
||||
u16 port = 5000;
|
||||
Usr_Flash.FlashData.IP_Addr[0] = 192;
|
||||
Usr_Flash.FlashData.IP_Addr[1] = 168;
|
||||
Usr_Flash.FlashData.IP_Addr[2] = 0;
|
||||
Usr_Flash.FlashData.IP_Addr[3] = 100;
|
||||
|
||||
Usr_Flash.FlashData.Port[0] = port >> 8;
|
||||
Usr_Flash.FlashData.Port[1] = port & 0x00ff;
|
||||
|
||||
Usr_Flash.FlashData.Sub_Mask[0] = 255;
|
||||
Usr_Flash.FlashData.Sub_Mask[1] = 255;
|
||||
Usr_Flash.FlashData.Sub_Mask[2] = 255;
|
||||
Usr_Flash.FlashData.Sub_Mask[3] = 0;
|
||||
|
||||
Usr_Flash.FlashData.Gateway_IP[0] = 192;
|
||||
Usr_Flash.FlashData.Gateway_IP[1] = 168;
|
||||
Usr_Flash.FlashData.Gateway_IP[2] = 0;
|
||||
Usr_Flash.FlashData.Gateway_IP[3] = 1;
|
||||
|
||||
Usr_Flash.FlashData.Devic_Id = 0;
|
||||
|
||||
// /*<2A>豸<EFBFBD>ͺ<EFBFBD> - 'Atlas Abatement' */
|
||||
// Usr_Flash.FlashData.Device_ID[0] = ('A' << 8) | 't'; // 'At'
|
||||
// Usr_Flash.FlashData.Device_ID[1] = ('l' << 8) | 'a'; // 'la'
|
||||
// Usr_Flash.FlashData.Device_ID[2] = ('s' << 8) | ' '; // 's '
|
||||
// Usr_Flash.FlashData.Device_ID[3] = ('A' << 8) | 'b'; // 'Ab'
|
||||
// Usr_Flash.FlashData.Device_ID[4] = ('a' << 8) | 't'; // 'at'
|
||||
// Usr_Flash.FlashData.Device_ID[5] = ('e' << 8) | 'm'; // 'em'
|
||||
// Usr_Flash.FlashData.Device_ID[6] = ('e' << 8) | 'n'; // 'en'
|
||||
// Usr_Flash.FlashData.Device_ID[7] = ('t' << 8) | 0x00; // 't\0'
|
||||
//
|
||||
// /*<2A>豸<EFBFBD><E8B1B8>ʶ - 'AHTWA07CHAAC' */
|
||||
// Usr_Flash.FlashData.Device_Model[0] = ('A' << 8) | 'H'; // 'AH'
|
||||
// Usr_Flash.FlashData.Device_Model[1] = ('T' << 8) | 'W'; // 'TW'
|
||||
// Usr_Flash.FlashData.Device_Model[2] = ('A' << 8) | '0'; // 'A0'
|
||||
// Usr_Flash.FlashData.Device_Model[3] = ('7' << 8) | 'C'; // '7C'
|
||||
// Usr_Flash.FlashData.Device_Model[4] = ('H' << 8) | 'A'; // 'HA'
|
||||
// Usr_Flash.FlashData.Device_Model[5] = ('A' << 8) | 'C'; // 'AC'
|
||||
//
|
||||
// Usr_Flash.FlashData.Data_ID1 = 0;
|
||||
// Usr_Flash.FlashData.Collection_event_ID1 = 111101; // <20>ĵ<EFBFBD><C4B5>е<EFBFBD>CEID
|
||||
//// Usr_Flash.FlashData.Report_ID1 = 2329004; // <20>ĵ<EFBFBD><C4B5>е<EFBFBD>Report ID
|
||||
// Usr_Flash.FlashData.Alarm_ID = 2320614; // <20>ĵ<EFBFBD><C4B5>е<EFBFBD>AlarmID
|
||||
//
|
||||
// /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD>ʼ<EFBFBD><CABC> */
|
||||
// const char *alarm_types[] = {"Major Warning", "Minor Warning", "Major Alarm", "Minor Alarm"};
|
||||
// for(int i = 0; i < 4; i++) {
|
||||
// const char *type = alarm_types[i];
|
||||
// for(int j = 0; j < 13 && type[j]; j++) {
|
||||
// if(j % 2 == 0) {
|
||||
// Usr_Flash.FlashData.Alarm_Type[i*2 + j/2] = (type[j] << 8) | (type[j+1] ? type[j+1] : 0);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
bsp_FlashDataWrite();
|
||||
}
|
||||
|
||||
static void bsp_Flash_Init(void)
|
||||
{
|
||||
u8 i;
|
||||
|
||||
bsp_FlashDataRead();
|
||||
if( Usr_Flash.FlashData.IP_Addr[0] == 0xff
|
||||
&& Usr_Flash.FlashData.IP_Addr[1] == 0xff
|
||||
&& Usr_Flash.FlashData.IP_Addr[2] == 0xff
|
||||
&& Usr_Flash.FlashData.IP_Addr[3] == 0xff
|
||||
)
|
||||
{
|
||||
bsp_FlashReset();
|
||||
}
|
||||
memcpy(&Usr_Flash.TempFlashData, &Usr_Flash.FlashData, sizeof(bsp_FlashData_t));
|
||||
W5500.IP_Addr[0] = Usr_Flash.FlashData.IP_Addr[0];
|
||||
W5500.IP_Addr[1] = Usr_Flash.FlashData.IP_Addr[1];
|
||||
W5500.IP_Addr[2] = Usr_Flash.FlashData.IP_Addr[2];
|
||||
W5500.IP_Addr[3] = Usr_Flash.FlashData.IP_Addr[3];
|
||||
|
||||
W5500.Gateway_IP[0] =Usr_Flash.FlashData.Gateway_IP[0];
|
||||
W5500.Gateway_IP[1]=Usr_Flash.FlashData.Gateway_IP[1];
|
||||
W5500.Gateway_IP[2]=Usr_Flash.FlashData.Gateway_IP[2];
|
||||
W5500.Gateway_IP[3]=Usr_Flash.FlashData.Gateway_IP[3];
|
||||
|
||||
W5500.W5500_Class[0].ConfigData.Port[0] = Usr_Flash.FlashData.Port[0];
|
||||
W5500.W5500_Class[0].ConfigData.Port[1] = Usr_Flash.FlashData.Port[1];
|
||||
|
||||
W5500.Sub_Mask[0] = Usr_Flash.FlashData.Sub_Mask[0];
|
||||
W5500.Sub_Mask[1] = Usr_Flash.FlashData.Sub_Mask[1];
|
||||
W5500.Sub_Mask[2] = Usr_Flash.FlashData.Sub_Mask[2];
|
||||
W5500.Sub_Mask[3] = Usr_Flash.FlashData.Sub_Mask[3];
|
||||
|
||||
HSMS.Flash_ConfigData.Device_Id = Usr_Flash.FlashData.Devic_Id;
|
||||
|
||||
}
|
||||
|
||||
static void bsp_FlashDataWrite(void)
|
||||
{
|
||||
/*<2A><>ֹ<EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>д<EFBFBD><D0B4>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD>*/
|
||||
if(memcmp(&Usr_Flash.TempFlashData, &Usr_Flash.FlashData, sizeof(bsp_FlashData_t)) != 0)
|
||||
{
|
||||
Wdg.Feed();
|
||||
|
||||
__disable_irq(); // <20><><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD>ж<EFBFBD>
|
||||
|
||||
HAL_StatusTypeDef status = bsp_Flash_STMFLASH_Write(BSP_FLASH_DATASAVE_ADDR,&Usr_Flash.FlashData,sizeof(bsp_FlashData_t));
|
||||
|
||||
if(status == HAL_OK)
|
||||
{
|
||||
// д<><D0B4><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
|
||||
memcpy(&Usr_Flash.TempFlashData, &Usr_Flash.FlashData, sizeof(bsp_FlashData_t));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
__enable_irq(); // <20>ָ<EFBFBD><D6B8>ж<EFBFBD>
|
||||
Wdg.Feed();
|
||||
}
|
||||
}
|
||||
|
||||
static void bsp_FlashDataRead(void)
|
||||
{
|
||||
Wdg.Feed();
|
||||
bsp_Flash_STMFLASH_Read(BSP_FLASH_DATASAVE_ADDR,
|
||||
&Usr_Flash.FlashData,
|
||||
sizeof(bsp_FlashData_t));
|
||||
Wdg.Feed();
|
||||
}
|
||||
63
usr/bsp/bsp_Flash.h
Normal file
63
usr/bsp/bsp_Flash.h
Normal file
@@ -0,0 +1,63 @@
|
||||
#ifndef _BSP_FLASH_H_
|
||||
#define _BSP_FLASH_H_
|
||||
|
||||
#include "main.h"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>һ<EFBFBD><D2BB>*/
|
||||
u16 SN[5];
|
||||
u8 IP_Addr[4];
|
||||
u8 Gateway_IP[4];
|
||||
u8 Port[2];
|
||||
u8 Sub_Mask[4];
|
||||
u16 Devic_Id;
|
||||
u16 Device_ID[8]; // 'Atlas Abatement' - 15<31>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>豸<EFBFBD>ͺţ<CDBA>16<31>ֽڣ<D6BD>
|
||||
u16 Device_Model[8]; // 'AHTWA07CHAAC' - 12<31>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD><CCA8>λ<EFBFBD>ã<EFBFBD>12<31>ֽڣ<D6BD>
|
||||
u16 Device_SN[8]; //<2F>豸SN<53><4E>
|
||||
u16 Station_Name[8]; // <20><>̨<EFBFBD><CCA8><EFBFBD><EFBFBD>
|
||||
u16 Chamber_Name[8]; // ǻ<><C7BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u16 Manufacturer[8]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-10<31>ַ<EFBFBD>
|
||||
u16 Version[8]; //<2F><>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD>汾<EFBFBD><E6B1BE>-10<31>ַ<EFBFBD>
|
||||
u16 Station_Type[8]; //<2F><>̨<EFBFBD><CCA8><EFBFBD><EFBFBD>
|
||||
|
||||
|
||||
u16 Alarm_info[20]; //ʹ<><CAB9>PM100<30>е<EFBFBD>
|
||||
u16 Data_ID1; //<2F>ÿ<EFBFBD>
|
||||
u32 Collection_event_ID1; //CEIDΪ<44>̶<EFBFBD>ֵ
|
||||
u32 Report_ID1; //<2F>ÿ<EFBFBD>
|
||||
u32 Alarm_ID; //ʹ<>ú<EFBFBD><C3BA><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>
|
||||
u16 Alarm_Type[7]; // ʹ<>ú<EFBFBD><C3BA><EFBFBD><EFBFBD>ڲ<EFBFBD>
|
||||
u16 Begin_Warning[7]; //<2F><><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2>̶<EFBFBD>Ϊbegin
|
||||
u16 IDS[11]; //<2F>ÿ<EFBFBD>
|
||||
u16 Over_Trigger[9];
|
||||
u16 Equipment[5];
|
||||
u16 E9[19];
|
||||
u16 Device_Type; //<2F>ÿ<EFBFBD>
|
||||
u16 Sensor;
|
||||
u16 Alarm_value;
|
||||
u16 Alarm_ubit;
|
||||
u16 Start_Time[11]; //<2F><>ʼʱ<CABC><CAB1>
|
||||
u16 Alarm_Time[6]; //<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
||||
u16 Alarm[6]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD><CCA8><EFBFBD><EFBFBD>
|
||||
u16 Data_ID2;
|
||||
u16 Collection_event_ID2;
|
||||
u16 Report_ID2;
|
||||
u16 Sub_Device_Type[2]; // <20><><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD>
|
||||
u16 Sub_Device_State[2]; // <20><><EFBFBD><EFBFBD><EFBFBD>豸״̬
|
||||
u16 State_Change_Time[2]; // ״̬<D7B4>л<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʽ
|
||||
} bsp_FlashData_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
bsp_FlashData_t TempFlashData;
|
||||
bsp_FlashData_t FlashData;
|
||||
void (*Init)(void);
|
||||
void (*Write)(void);
|
||||
void (*Read)(void);
|
||||
void (*Reset)(void);
|
||||
} bsp_Flash_t;
|
||||
|
||||
extern bsp_Flash_t Usr_Flash;
|
||||
|
||||
#endif
|
||||
39
usr/bsp/bsp_Key.c
Normal file
39
usr/bsp/bsp_Key.c
Normal file
@@ -0,0 +1,39 @@
|
||||
#include "bsp_Key.h"
|
||||
#include "os_timer.h"
|
||||
#include "bsp_Flash.h"
|
||||
|
||||
#define BSP_KEY_ENTER_NUM 500
|
||||
|
||||
static void bsp_key_init(void);
|
||||
static void bsp_key_task(void);
|
||||
|
||||
bsp_key_t key =
|
||||
{
|
||||
.init = bsp_key_init,
|
||||
.task = bsp_key_task,
|
||||
};
|
||||
|
||||
static bsp_key_t *p_key = &key;
|
||||
|
||||
static void bsp_key_init(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
static void bsp_key_task(void)
|
||||
{
|
||||
if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(SYS_RESET_GPIO_Port,SYS_RESET_Pin))
|
||||
{
|
||||
p_key->count++;
|
||||
}
|
||||
else
|
||||
{
|
||||
p_key->count = 0;
|
||||
}
|
||||
if(BSP_KEY_ENTER_NUM <= p_key->count)
|
||||
{
|
||||
/*ϵͳ<CFB5><CDB3>λ*/
|
||||
Usr_Flash.Reset();
|
||||
HAL_NVIC_SystemReset();
|
||||
}
|
||||
}
|
||||
12
usr/bsp/bsp_Key.h
Normal file
12
usr/bsp/bsp_Key.h
Normal file
@@ -0,0 +1,12 @@
|
||||
#ifndef _BSP_KEY_H_
|
||||
#define _BSP_KEY_H_
|
||||
|
||||
#include "main.h"
|
||||
typedef struct
|
||||
{
|
||||
u16 count;
|
||||
void (*init)(void);
|
||||
void (*task)(void);
|
||||
}bsp_key_t;
|
||||
extern bsp_key_t key;
|
||||
#endif
|
||||
15
usr/bsp/bsp_LED.h
Normal file
15
usr/bsp/bsp_LED.h
Normal file
@@ -0,0 +1,15 @@
|
||||
#ifndef _BSP_LED_H_
|
||||
#define _BSP_LED_H_
|
||||
|
||||
#include "main.h"
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
void (*Init)(void);
|
||||
void (*Flash)(void);
|
||||
}bsp_Led_t;
|
||||
|
||||
extern bsp_Led_t Led;
|
||||
|
||||
#endif
|
||||
25
usr/bsp/bsp_Led.c
Normal file
25
usr/bsp/bsp_Led.c
Normal file
@@ -0,0 +1,25 @@
|
||||
#include "bsp_Led.h"
|
||||
#include "os_timer.h"
|
||||
|
||||
static void bsp_Led_Init(void);
|
||||
static void bsp_Led_Flash(void);
|
||||
|
||||
bsp_Led_t Led =
|
||||
{
|
||||
.Init = bsp_Led_Init,
|
||||
.Flash = bsp_Led_Flash,
|
||||
};
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD><CBB8><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
static void bsp_Led_Init(void)
|
||||
{
|
||||
for(u8 i = 0;i < 20;i++)
|
||||
{
|
||||
Delay_ms(50);
|
||||
HAL_GPIO_TogglePin(LED_RUN_GPIO_Port, LED_RUN_Pin);
|
||||
}
|
||||
}
|
||||
|
||||
static void bsp_Led_Flash(void)
|
||||
{
|
||||
HAL_GPIO_TogglePin(LED_RUN_GPIO_Port, LED_RUN_Pin);
|
||||
}
|
||||
207
usr/bsp/bsp_Uart.c
Normal file
207
usr/bsp/bsp_Uart.c
Normal file
@@ -0,0 +1,207 @@
|
||||
#include "bsp_Uart.h"
|
||||
#include "string.h"
|
||||
|
||||
#define RX_TEMP_BUFF_NUM (1100)
|
||||
|
||||
#define UART1_TX_LEN (32)
|
||||
#define UART1_RX_LEN (1100)
|
||||
|
||||
#define UART2_TX_LEN (32)
|
||||
#define UART2_RX_LEN (1100)
|
||||
|
||||
u8 Rx_Temp_Buff[RX_TEMP_BUFF_NUM];
|
||||
|
||||
/*<2A><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>DMA<4D><41><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>*/
|
||||
u8 Uart1_TX_Buff[UART1_TX_LEN];
|
||||
u8 Uart1_Rx_Buff[UART1_RX_LEN];
|
||||
|
||||
u8 Uart2_TX_Buff[UART1_TX_LEN];
|
||||
u8 Uart2_Rx_Buff[UART1_RX_LEN];
|
||||
|
||||
|
||||
|
||||
/*<2A><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>DMA+<2B><><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD>+<2B><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>*/
|
||||
|
||||
static void bsp_Uart_Init(bsp_Uart_t *p_Uart);
|
||||
static void bsp_Uart_Send(bsp_Uart_t *p_Uart,u8 *pData, u16 Len);
|
||||
static void bsp_Uart_Tx_DMA_TCInt(bsp_Uart_t *p_Uart);
|
||||
static void bsp_Uart_Rx_IdleInt(bsp_Uart_t *p_Uart);
|
||||
static void bsp_Uart_Rx_TimeIncrement(bsp_Uart_t *p_Uart,u16 Time);
|
||||
static void bsp_Uart_Rx_TimeStart(bsp_Uart_t *p_Uart);
|
||||
static void bsp_Uart_Rx_TimeStop(bsp_Uart_t *p_Uart);
|
||||
static void bsp_Uart_Rx_Task(bsp_Uart_t *p_Uart);
|
||||
|
||||
bsp_Uart_t COM_Uart1 =
|
||||
{
|
||||
.RxQueue = queue(u8,UART1_RX_LEN),
|
||||
.Uart =USART1,
|
||||
|
||||
.Tx_DMA = DMA1,
|
||||
.Rx_DMA = DMA1,
|
||||
|
||||
.Rx_DMA_CH = LL_DMA_CHANNEL_4,
|
||||
.Tx_DMA_CH = LL_DMA_CHANNEL_5,
|
||||
|
||||
.Tx_DMA_Len = UART1_TX_LEN,
|
||||
.Rx_DMA_Len = UART1_RX_LEN,
|
||||
|
||||
.Tx_Addr = &Uart1_TX_Buff[0],
|
||||
.Rx_Addr = &Uart1_Rx_Buff[0],
|
||||
|
||||
.Tx_DMA_CompleteFlag = 1,
|
||||
.Rx_TimeOver = 10, /*<2A><><EFBFBD>ճ<EFBFBD>ʱʱ<CAB1><CAB1>10ms <20><><EFBFBD><EFBFBD>Ϊ0ʱΪ<CAB1><CEAA><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD><EFBFBD>жϴ<D0B6><CFB4><EFBFBD> <20><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>*/
|
||||
|
||||
.Init = bsp_Uart_Init,
|
||||
.Send = bsp_Uart_Send,
|
||||
|
||||
.Tx_DMA_TCInt = bsp_Uart_Tx_DMA_TCInt,
|
||||
|
||||
.Rx_IdleInt = bsp_Uart_Rx_IdleInt,
|
||||
.Rx_TimeIncrementInt = bsp_Uart_Rx_TimeIncrement,
|
||||
.Rx_DataAnalysis = NULL,
|
||||
.Rx_Task = bsp_Uart_Rx_Task,
|
||||
};
|
||||
|
||||
bsp_Uart_t COM_Uart2 =
|
||||
{
|
||||
.RxQueue = queue(u8,UART2_RX_LEN),
|
||||
.Uart =USART2,
|
||||
|
||||
.Tx_DMA = DMA1,
|
||||
.Rx_DMA = DMA1,
|
||||
|
||||
.Rx_DMA_CH = LL_DMA_CHANNEL_1,
|
||||
.Tx_DMA_CH = LL_DMA_CHANNEL_2,
|
||||
|
||||
.Tx_DMA_Len = UART2_TX_LEN,
|
||||
.Rx_DMA_Len = UART2_RX_LEN,
|
||||
|
||||
.Tx_Addr = &Uart2_TX_Buff[0],
|
||||
.Rx_Addr = &Uart2_Rx_Buff[0],
|
||||
|
||||
.Tx_DMA_CompleteFlag = 1,
|
||||
.Rx_TimeOver = 5, /*<2A><><EFBFBD>ճ<EFBFBD>ʱʱ<CAB1><CAB1>10ms<6D><73><EFBFBD><EFBFBD>Ϊ0ʱΪ<CAB1><CEAA><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD><EFBFBD>жϴ<D0B6><CFB4><EFBFBD> <20><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>*/
|
||||
|
||||
.Init = bsp_Uart_Init,
|
||||
.Send = bsp_Uart_Send,
|
||||
|
||||
.Tx_DMA_TCInt = bsp_Uart_Tx_DMA_TCInt,
|
||||
|
||||
.Rx_IdleInt = bsp_Uart_Rx_IdleInt,
|
||||
.Rx_TimeIncrementInt = bsp_Uart_Rx_TimeIncrement,
|
||||
.Rx_DataAnalysis = NULL,
|
||||
.Rx_Task = bsp_Uart_Rx_Task,
|
||||
};
|
||||
|
||||
|
||||
static void bsp_Uart_Init(bsp_Uart_t *p_Uart)
|
||||
{
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
p_Uart->Rx_DataAnalysis = NULL;
|
||||
|
||||
/*RX*/
|
||||
if(NULL == p_Uart->Uart)
|
||||
return;
|
||||
LL_USART_EnableIT_RXNE(p_Uart->Uart); //ʹ<>ܴ<EFBFBD><DCB4>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD>ж<EFBFBD>
|
||||
if(NULL != p_Uart->Rx_DMA)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
static void bsp_Uart2_DMASend(bsp_Uart_t *p_Uart,u8 *pData, u16 Len)
|
||||
{
|
||||
while (!p_Uart->Tx_DMA_CompleteFlag); /*<2A>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɱ<EFBFBD>־*/
|
||||
p_Uart->Tx_DMA_CompleteFlag = 0;
|
||||
|
||||
if(p_Uart->Tx_DMA_Len < Len)
|
||||
Len = p_Uart->Tx_DMA_Len;
|
||||
|
||||
memcpy(p_Uart->Tx_Addr, pData, Len); /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD>*/
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>*/
|
||||
static void bsp_Uart_Rx_IdleInt(bsp_Uart_t *p_Uart)
|
||||
{
|
||||
u8 rx_data;
|
||||
rx_data = LL_USART_ReceiveData8(p_Uart->Uart);
|
||||
queue_push_back(p_Uart->RxQueue,(void *)&rx_data);
|
||||
/*<2A><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>*/
|
||||
bsp_Uart_Rx_TimeStart(p_Uart);
|
||||
}
|
||||
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
static void bsp_Uart_Send(bsp_Uart_t *p_Uart,u8 *pData, u16 Len)
|
||||
{
|
||||
u16 i;
|
||||
for (i = 0; i < Len; i++)
|
||||
{
|
||||
while (!LL_USART_IsActiveFlag_TXE(p_Uart->Uart));
|
||||
LL_USART_TransmitData8(p_Uart->Uart, pData[i]); // <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
}
|
||||
|
||||
static void bsp_Uart_Tx_DMA_TCInt(bsp_Uart_t *p_Uart)
|
||||
{
|
||||
p_Uart->Tx_DMA_CompleteFlag = 1;
|
||||
}
|
||||
|
||||
/*<2A>жϼ<D0B6><CFBC><EFBFBD>*/
|
||||
static void bsp_Uart_Rx_TimeIncrement(bsp_Uart_t *p_Uart,u16 Time)
|
||||
{
|
||||
/*<2A><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>*/
|
||||
if(1 == p_Uart->Rx_StartFlag)
|
||||
{
|
||||
p_Uart->Rx_TimeCount += Time;
|
||||
}
|
||||
}
|
||||
|
||||
/*<2A><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>*/
|
||||
static void bsp_Uart_Rx_TimeStart(bsp_Uart_t *p_Uart)
|
||||
{
|
||||
p_Uart->Rx_StartFlag = 1;
|
||||
p_Uart->Rx_TimeCount = 0;
|
||||
}
|
||||
|
||||
/*ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>*/
|
||||
static void bsp_Uart_Rx_TimeStop(bsp_Uart_t *p_Uart)
|
||||
{
|
||||
p_Uart->Rx_StartFlag = 0;
|
||||
p_Uart->Rx_TimeCount = 0;
|
||||
}
|
||||
|
||||
static void bsp_Uart_Rx_Task(bsp_Uart_t *p_Uart)
|
||||
{
|
||||
/*<2A><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD><EFBFBD>յ<EFBFBD>һ֡<D2BB><D6A1><EFBFBD><EFBFBD>*/
|
||||
if(p_Uart->Rx_TimeOver < p_Uart->Rx_TimeCount)
|
||||
{
|
||||
p_Uart->Rx_Len = queue_size(p_Uart->RxQueue);
|
||||
/*ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>*/
|
||||
bsp_Uart_Rx_TimeStop(p_Uart);
|
||||
if(p_Uart->Rx_Len <= p_Uart->Rx_DMA_Len && (0 != p_Uart->Rx_Len))
|
||||
{
|
||||
if(RX_TEMP_BUFF_NUM < p_Uart->Rx_Len)
|
||||
{
|
||||
queue_clear(p_Uart->RxQueue);
|
||||
}
|
||||
else
|
||||
{
|
||||
for(u16 i = 0;i < p_Uart->Rx_Len;i++)
|
||||
{
|
||||
queue_pop(p_Uart->RxQueue,&Rx_Temp_Buff[i]);
|
||||
}
|
||||
if(NULL != p_Uart->Rx_DataAnalysis)
|
||||
{
|
||||
p_Uart->Rx_DataAnalysis(Rx_Temp_Buff,p_Uart->Rx_Len,p_Uart); /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
}
|
||||
//p_Uart->Send(p_Uart,Rx_Buff,p_Uart->Rx_Len);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
44
usr/bsp/bsp_Uart.h
Normal file
44
usr/bsp/bsp_Uart.h
Normal file
@@ -0,0 +1,44 @@
|
||||
#ifndef _BSP_UART_H_
|
||||
#define _BSP_UART_H_
|
||||
|
||||
#include "main.h"
|
||||
#include "algo_queue.h"
|
||||
|
||||
typedef struct bsp_Uart_t bsp_Uart_t;
|
||||
|
||||
struct bsp_Uart_t
|
||||
{
|
||||
queue RxQueue; /*<2A><><EFBFBD>ݽ<EFBFBD><DDBD>ն<EFBFBD><D5B6><EFBFBD>*/
|
||||
USART_TypeDef *Uart; /*<2A><><EFBFBD><EFBFBD>*/
|
||||
|
||||
DMA_TypeDef *Tx_DMA; /*DMA*/
|
||||
DMA_TypeDef *Rx_DMA;
|
||||
u8 Tx_DMA_CH;
|
||||
u8 Rx_DMA_CH;
|
||||
vu8 Tx_DMA_CompleteFlag; /*DMA<4D><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɱ<EFBFBD>־λ*/
|
||||
|
||||
u8 *Tx_Addr; /*DMA<4D><41><EFBFBD>˻<EFBFBD><CBBB><EFBFBD>*/
|
||||
u8 *Rx_Addr;
|
||||
u16 Tx_DMA_Len;
|
||||
u16 Rx_DMA_Len;
|
||||
|
||||
u16 Rx_Len; /*<2A><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>*/
|
||||
u16 Rx_TimeCount; /*<2A><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>*/
|
||||
u16 Rx_TimeOver; /*<2A><>ʱʱ<CAB1><CAB1>*/
|
||||
u8 Rx_StartFlag; /*<2A><>ʼ<EFBFBD><CABC>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־λ*/
|
||||
|
||||
void (*Init)(bsp_Uart_t *); /*<2A><>ʼ<EFBFBD><CABC>*/
|
||||
void (*Send)(bsp_Uart_t *,u8 *,u16); /*<2A><><EFBFBD>ڷ<EFBFBD><DAB7>ͺ<EFBFBD><CDBA><EFBFBD>*/
|
||||
|
||||
void (*Tx_DMA_TCInt)(bsp_Uart_t *); /*DMA<4D><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>*/
|
||||
|
||||
void (*Rx_IdleInt)(bsp_Uart_t *); /*<2A><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>*/
|
||||
void (*Rx_TimeIncrementInt)(bsp_Uart_t *,u16); /*<2A>жϼ<D0B6><CFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
void (*Rx_DataAnalysis)(u8 *,u16,void *); /*<2A><><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD>*/
|
||||
void (*Rx_Task)(bsp_Uart_t *); /*<2A><><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
|
||||
};
|
||||
|
||||
extern bsp_Uart_t COM_Uart1;
|
||||
extern bsp_Uart_t COM_Uart2;
|
||||
#endif
|
||||
852
usr/bsp/bsp_W5500.c
Normal file
852
usr/bsp/bsp_W5500.c
Normal file
@@ -0,0 +1,852 @@
|
||||
/**********************************************************************************
|
||||
* <20>ļ<EFBFBD><C4BC><EFBFBD> <20><>W5500.c
|
||||
* <20><><EFBFBD><EFBFBD> <20><>W5500 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD>汾 <20><>ST_v3.5
|
||||
* <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>ģ<EFBFBD>鿪<EFBFBD><E9BFAA><EFBFBD>Ŷ<EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD> <20><>http://nirenelec.blog.163.com
|
||||
* <20>Ա<EFBFBD> <20><>http://nirenelec.taobao.com
|
||||
**********************************************************************************/
|
||||
|
||||
#include "stm32f1xx.h"
|
||||
#include "stm32f1xx_hal_spi.h"
|
||||
|
||||
#include "bsp_W5500.h"
|
||||
#include "usart.h"
|
||||
#include "stdio.h"
|
||||
#include "spi.h"
|
||||
#include "bsp_print.h"
|
||||
|
||||
|
||||
#define BSP_W5500_SPI_CS_LOW
|
||||
|
||||
|
||||
/*Run_Mode <20>˿ڵ<CBBF><DAB5><EFBFBD><EFBFBD><EFBFBD>ģʽ*/
|
||||
#define BSP_W5500_PORT_RUN_MODE_TCP_SERVER 0x00 /*TCP<43><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ*/
|
||||
#define BSP_W5500_PORT_RUN_MODE_TCP_CLIENT 0x01 /*TCP<43>ͻ<EFBFBD><CDBB><EFBFBD>ģʽ*/
|
||||
#define BSP_W5500_PORT_RUN_MODE_UDP 0x02 /*UDP(<28>㲥)ģʽ*/
|
||||
|
||||
/*Run_State <20>˿ڵ<CBBF><DAB5><EFBFBD><EFBFBD><EFBFBD>״̬ BITλ*/
|
||||
#define BSP_W5500_PORT_RUN_STATE_INIT 0x01 /*<2A>˿<EFBFBD><CBBF><EFBFBD><EFBFBD>ɳ<EFBFBD>ʼ<EFBFBD><CABC>*/
|
||||
#define BSP_W5500_PORT_RUN_STATE_CONN 0x02 /*<2A>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
|
||||
/*TR_Data_State <20>˿ڵ<CBBF><DAB5>շ<EFBFBD><D5B7><EFBFBD><EFBFBD><EFBFBD>״̬*/
|
||||
#define BSP_W5500_PORT_DATA_RECEIVE 0x01 /*<2A>˿ڽ<CBBF><DABD>յ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>*/
|
||||
#define BSP_W5500_PORT_DATA_TRANSMITOK 0x02 /*<2A>˿ڷ<CBBF><DAB7><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
|
||||
static void bsp_W5500_Interrupt_Process(void);
|
||||
static void bsp_W5500_Init(void);
|
||||
static void bsp_W5500_Task(void);
|
||||
static void Write_SOCK_Data_Buffer(bsp_W5500_Class_t *pW5500_Class, u8 *dat_ptr, u16 size);
|
||||
static void network_monitor_task(void);
|
||||
void bsp_W5500_Socket_Set(bsp_W5500_Class_t *pW5500_Class);
|
||||
|
||||
static u8 last_link_status = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>·״̬
|
||||
bsp_W5500_t W5500 =
|
||||
{
|
||||
.Gateway_IP = {192,168,1,1},
|
||||
.Sub_Mask = {255,255,255,0},
|
||||
.Phy_Addr = {0x0c,0x29,0xab,0x7c,0x00,0x01},
|
||||
|
||||
//.IP_Addr = {169,254,107,101},
|
||||
.IP_Addr = {192,168,1,101},
|
||||
.Monitor_task = network_monitor_task,
|
||||
.Interrupt_Process = bsp_W5500_Interrupt_Process,
|
||||
|
||||
.Init = bsp_W5500_Init,
|
||||
.Task = bsp_W5500_Task,
|
||||
.Socket_Send = Write_SOCK_Data_Buffer,
|
||||
|
||||
.W5500_Class[0] =
|
||||
{
|
||||
.SocketPort = 0, /*ʹ<>ö˿<C3B6>0*/
|
||||
.ConfigData.Port = {0x13,0x88},
|
||||
// .ConfigData.DIP = {192,168,1,32},
|
||||
// .ConfigData.DPort = {0x03,0x09},
|
||||
.Run_Mode = BSP_W5500_PORT_RUN_MODE_TCP_SERVER,
|
||||
// .Rx_DataAnalysis = proto_HSMS_Rx_DataAnalysis,
|
||||
},
|
||||
};
|
||||
|
||||
bsp_W5500_t *pW5500 = &W5500;
|
||||
|
||||
/*******************************************************************************
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : SPI1_Send_Byte
|
||||
* <20><><EFBFBD><EFBFBD> : SPI1<49><31><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD> : dat:<3A><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD> : <20><>
|
||||
* <20><><EFBFBD><EFBFBD>ֵ : <20><>
|
||||
* ˵<><CBB5> : <20><>
|
||||
*******************************************************************************/
|
||||
void SPI1_Send_Byte(u8 dat)
|
||||
{
|
||||
// hspi1.Instance->DR=dat;
|
||||
HAL_SPI_Transmit(&hspi1, &dat, 1, 0xff);
|
||||
// while(__HAL_SPI_GET_FLAG(&hspi1,SPI_FLAG_TXE)==RESET);
|
||||
// SPI_I2S_SendData(SPI1,dat);//д1<D0B4><31><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ݼĴ<DDBC><C4B4><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : SPI1_Send_Short
|
||||
* <20><><EFBFBD><EFBFBD> : SPI1<49><31><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>(16λ)
|
||||
* <20><><EFBFBD><EFBFBD> : dat:<3A><><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>16λ<36><CEBB><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD> : <20><>
|
||||
* <20><><EFBFBD><EFBFBD>ֵ : <20><>
|
||||
* ˵<><CBB5> : <20><>
|
||||
*******************************************************************************/
|
||||
void SPI1_Send_Short(u16 dat)
|
||||
{
|
||||
SPI1_Send_Byte(dat >> 8); // д<><D0B4><EFBFBD>ݸ<EFBFBD>λ
|
||||
SPI1_Send_Byte(dat); // д<><D0B4><EFBFBD>ݵ<EFBFBD>λ
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : Write_W5500_1Byte
|
||||
* <20><><EFBFBD><EFBFBD> : ͨ<><CDA8>SPI1<49><31>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ַ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>д1<D0B4><31><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD> : reg:16λ<36>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ,dat:<3A><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD> : <20><>
|
||||
* <20><><EFBFBD><EFBFBD>ֵ : <20><>
|
||||
* ˵<><CBB5> : <20><>
|
||||
*******************************************************************************/
|
||||
void Write_W5500_1Byte(u16 reg, u8 dat)
|
||||
{
|
||||
HAL_GPIO_WritePin(W5500_SCS_PORT, W5500_SCS, GPIO_PIN_RESET); // <20><>W5500<30><30>SCSΪ<53>͵<EFBFBD>ƽ
|
||||
|
||||
SPI1_Send_Short(reg); // ͨ<><CDA8>SPI1д16λ<36>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
SPI1_Send_Byte(FDM1 | RWB_WRITE | COMMON_R); // ͨ<><CDA8>SPI1д<31><D0B4><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>,1<><31><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>,д<><D0B4><EFBFBD><EFBFBD>,ѡ<><D1A1>ͨ<EFBFBD>üĴ<C3BC><C4B4><EFBFBD>
|
||||
SPI1_Send_Byte(dat); // д1<D0B4><31><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
HAL_GPIO_WritePin(W5500_SCS_PORT, W5500_SCS, GPIO_PIN_SET); // <20><>W5500<30><30>SCSΪ<53>ߵ<EFBFBD>ƽ
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : Write_W5500_2Byte
|
||||
* <20><><EFBFBD><EFBFBD> : ͨ<><CDA8>SPI1<49><31>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ַ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>д2<D0B4><32><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD> : reg:16λ<36>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ,dat:16λ<36><CEBB>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(2<><32><EFBFBD>ֽ<EFBFBD>)
|
||||
* <20><><EFBFBD><EFBFBD> : <20><>
|
||||
* <20><><EFBFBD><EFBFBD>ֵ : <20><>
|
||||
* ˵<><CBB5> : <20><>
|
||||
*******************************************************************************/
|
||||
void Write_W5500_2Byte(u16 reg, u16 dat)
|
||||
{
|
||||
HAL_GPIO_WritePin(W5500_SCS_PORT, W5500_SCS, GPIO_PIN_RESET); // <20><>W5500<30><30>SCSΪ<53>͵<EFBFBD>ƽ
|
||||
|
||||
SPI1_Send_Short(reg); // ͨ<><CDA8>SPI1д16λ<36>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
SPI1_Send_Byte(FDM2 | RWB_WRITE | COMMON_R); // ͨ<><CDA8>SPI1д<31><D0B4><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>,2<><32><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>,д<><D0B4><EFBFBD><EFBFBD>,ѡ<><D1A1>ͨ<EFBFBD>üĴ<C3BC><C4B4><EFBFBD>
|
||||
SPI1_Send_Short(dat); // д16λ<36><CEBB><EFBFBD><EFBFBD>
|
||||
|
||||
HAL_GPIO_WritePin(W5500_SCS_PORT, W5500_SCS, GPIO_PIN_SET); // <20><>W5500<30><30>SCSΪ<53>ߵ<EFBFBD>ƽ
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : Write_W5500_nByte
|
||||
* <20><><EFBFBD><EFBFBD> : ͨ<><CDA8>SPI1<49><31>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ַ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>дn<D0B4><6E><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD> : reg:16λ<36>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ,*dat_ptr:<3A><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>,size:<3A><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD> : <20><>
|
||||
* <20><><EFBFBD><EFBFBD>ֵ : <20><>
|
||||
* ˵<><CBB5> : <20><>
|
||||
*******************************************************************************/
|
||||
void Write_W5500_nByte(u16 reg, u8 *dat_ptr, u16 size)
|
||||
{
|
||||
u16 i;
|
||||
|
||||
HAL_GPIO_WritePin(W5500_SCS_PORT, W5500_SCS, GPIO_PIN_RESET); // <20><>W5500<30><30>SCSΪ<53>͵<EFBFBD>ƽ
|
||||
|
||||
SPI1_Send_Short(reg); // ͨ<><CDA8>SPI1д16λ<36>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
SPI1_Send_Byte(VDM | RWB_WRITE | COMMON_R); // ͨ<><CDA8>SPI1д<31><D0B4><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>,N<><4E><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>,д<><D0B4><EFBFBD><EFBFBD>,ѡ<><D1A1>ͨ<EFBFBD>üĴ<C3BC><C4B4><EFBFBD>
|
||||
|
||||
for (i = 0; i < size; i++) // ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>size<7A><65><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>W5500
|
||||
{
|
||||
SPI1_Send_Byte(*dat_ptr++); // дһ<D0B4><D2BB><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
|
||||
HAL_GPIO_WritePin(W5500_SCS_PORT, W5500_SCS, GPIO_PIN_SET); // <20><>W5500<30><30>SCSΪ<53>ߵ<EFBFBD>ƽ
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : Write_W5500_SOCK_1Byte
|
||||
* <20><><EFBFBD><EFBFBD> : ͨ<><CDA8>SPI1<49><31>ָ<EFBFBD><D6B8><EFBFBD>˿ڼĴ<DABC><C4B4><EFBFBD>д1<D0B4><31><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD> : s:<3A>˿ں<CBBF>,reg:16λ<36>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ,dat:<3A><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD> : <20><>
|
||||
* <20><><EFBFBD><EFBFBD>ֵ : <20><>
|
||||
* ˵<><CBB5> : <20><>
|
||||
*******************************************************************************/
|
||||
void Write_W5500_SOCK_1Byte(SOCKET s, u16 reg, u8 dat)
|
||||
{
|
||||
HAL_GPIO_WritePin(W5500_SCS_PORT, W5500_SCS, GPIO_PIN_RESET); // <20><>W5500<30><30>SCSΪ<53>͵<EFBFBD>ƽ
|
||||
|
||||
SPI1_Send_Short(reg); // ͨ<><CDA8>SPI1д16λ<36>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
SPI1_Send_Byte(FDM1 | RWB_WRITE | (s * 0x20 + 0x08)); // ͨ<><CDA8>SPI1д<31><D0B4><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>,1<><31><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>,д<><D0B4><EFBFBD><EFBFBD>,ѡ<><D1A1><EFBFBD>˿<EFBFBD>s<EFBFBD>ļĴ<C4BC><C4B4><EFBFBD>
|
||||
SPI1_Send_Byte(dat); // д1<D0B4><31><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
HAL_GPIO_WritePin(W5500_SCS_PORT, W5500_SCS, GPIO_PIN_SET); // <20><>W5500<30><30>SCSΪ<53>ߵ<EFBFBD>ƽ
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : Write_W5500_SOCK_2Byte
|
||||
* <20><><EFBFBD><EFBFBD> : ͨ<><CDA8>SPI1<49><31>ָ<EFBFBD><D6B8><EFBFBD>˿ڼĴ<DABC><C4B4><EFBFBD>д2<D0B4><32><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD> : s:<3A>˿ں<CBBF>,reg:16λ<36>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ,dat:16λ<36><CEBB>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(2<><32><EFBFBD>ֽ<EFBFBD>)
|
||||
* <20><><EFBFBD><EFBFBD> : <20><>
|
||||
* <20><><EFBFBD><EFBFBD>ֵ : <20><>
|
||||
* ˵<><CBB5> : <20><>
|
||||
*******************************************************************************/
|
||||
void Write_W5500_SOCK_2Byte(SOCKET s, u16 reg, u16 dat)
|
||||
{
|
||||
HAL_GPIO_WritePin(W5500_SCS_PORT, W5500_SCS, GPIO_PIN_RESET); // <20><>W5500<30><30>SCSΪ<53>͵<EFBFBD>ƽ
|
||||
|
||||
SPI1_Send_Short(reg); // ͨ<><CDA8>SPI1д16λ<36>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
SPI1_Send_Byte(FDM2 | RWB_WRITE | (s * 0x20 + 0x08)); // ͨ<><CDA8>SPI1д<31><D0B4><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>,2<><32><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>,д<><D0B4><EFBFBD><EFBFBD>,ѡ<><D1A1><EFBFBD>˿<EFBFBD>s<EFBFBD>ļĴ<C4BC><C4B4><EFBFBD>
|
||||
SPI1_Send_Short(dat); // д16λ<36><CEBB><EFBFBD><EFBFBD>
|
||||
|
||||
HAL_GPIO_WritePin(W5500_SCS_PORT, W5500_SCS, GPIO_PIN_SET); // <20><>W5500<30><30>SCSΪ<53>ߵ<EFBFBD>ƽ
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : Write_W5500_SOCK_4Byte
|
||||
* <20><><EFBFBD><EFBFBD> : ͨ<><CDA8>SPI1<49><31>ָ<EFBFBD><D6B8><EFBFBD>˿ڼĴ<DABC><C4B4><EFBFBD>д4<D0B4><34><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD> : s:<3A>˿ں<CBBF>,reg:16λ<36>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ,*dat_ptr:<3A><>д<EFBFBD><D0B4><EFBFBD><EFBFBD>4<EFBFBD><34><EFBFBD>ֽڻ<D6BD><DABB><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
||||
* <20><><EFBFBD><EFBFBD> : <20><>
|
||||
* <20><><EFBFBD><EFBFBD>ֵ : <20><>
|
||||
* ˵<><CBB5> : <20><>
|
||||
*******************************************************************************/
|
||||
void Write_W5500_SOCK_4Byte(SOCKET s, u16 reg, u8 *dat_ptr)
|
||||
{
|
||||
HAL_GPIO_WritePin(W5500_SCS_PORT, W5500_SCS, GPIO_PIN_RESET); // <20><>W5500<30><30>SCSΪ<53>͵<EFBFBD>ƽ
|
||||
|
||||
SPI1_Send_Short(reg); // ͨ<><CDA8>SPI1д16λ<36>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
SPI1_Send_Byte(FDM4 | RWB_WRITE | (s * 0x20 + 0x08)); // ͨ<><CDA8>SPI1д<31><D0B4><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>,4<><34><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>,д<><D0B4><EFBFBD><EFBFBD>,ѡ<><D1A1><EFBFBD>˿<EFBFBD>s<EFBFBD>ļĴ<C4BC><C4B4><EFBFBD>
|
||||
|
||||
SPI1_Send_Byte(*dat_ptr++); // д<><D0B4>1<EFBFBD><31><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
SPI1_Send_Byte(*dat_ptr++); // д<><D0B4>2<EFBFBD><32><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
SPI1_Send_Byte(*dat_ptr++); // д<><D0B4>3<EFBFBD><33><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
SPI1_Send_Byte(*dat_ptr++); // д<><D0B4>4<EFBFBD><34><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
HAL_GPIO_WritePin(W5500_SCS_PORT, W5500_SCS, GPIO_PIN_SET); // <20><>W5500<30><30>SCSΪ<53>ߵ<EFBFBD>ƽ
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : Read_W5500_1Byte
|
||||
* <20><><EFBFBD><EFBFBD> : <20><>W5500ָ<30><D6B8><EFBFBD><EFBFBD>ַ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD> : reg:16λ<36>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
* <20><><EFBFBD><EFBFBD> : <20><>
|
||||
* <20><><EFBFBD><EFBFBD>ֵ : <20><>ȡ<EFBFBD><C8A1><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* ˵<><CBB5> : <20><>
|
||||
*******************************************************************************/
|
||||
u8 Read_W5500_1Byte(u16 reg)
|
||||
{
|
||||
u8 i;
|
||||
|
||||
HAL_GPIO_WritePin(W5500_SCS_PORT, W5500_SCS, GPIO_PIN_RESET); // <20><>W5500<30><30>SCSΪ<53>͵<EFBFBD>ƽ
|
||||
|
||||
SPI1_Send_Short(reg); // ͨ<><CDA8>SPI1д16λ<36>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
SPI1_Send_Byte(FDM1 | RWB_READ | COMMON_R); // ͨ<><CDA8>SPI1д<31><D0B4><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>,1<><31><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,ѡ<><D1A1>ͨ<EFBFBD>üĴ<C3BC><C4B4><EFBFBD>
|
||||
i = hspi1.Instance->DR;
|
||||
// HAL_SPI_Receive(&hspi1,&i,1,0xf);
|
||||
// i=SPI_I2S_ReceiveData(SPI1);
|
||||
SPI1_Send_Byte(0x00); // <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
i = hspi1.Instance->DR;
|
||||
// HAL_SPI_Receive(&hspi1,&i,1,0xf);
|
||||
|
||||
// i=SPI_I2S_ReceiveData(SPI1);//<2F><>ȡ1<C8A1><31><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
HAL_GPIO_WritePin(W5500_SCS_PORT, W5500_SCS, GPIO_PIN_SET); // <20><>W5500<30><30>SCSΪ<53>ߵ<EFBFBD>ƽ
|
||||
return i; // <20><><EFBFBD>ض<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : Read_W5500_SOCK_1Byte
|
||||
* <20><><EFBFBD><EFBFBD> : <20><>W5500ָ<30><D6B8><EFBFBD>˿ڼĴ<DABC><C4B4><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD> : s:<3A>˿ں<CBBF>,reg:16λ<36>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
* <20><><EFBFBD><EFBFBD> : <20><>
|
||||
* <20><><EFBFBD><EFBFBD>ֵ : <20><>ȡ<EFBFBD><C8A1><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* ˵<><CBB5> : <20><>
|
||||
*******************************************************************************/
|
||||
u8 Read_W5500_SOCK_1Byte(SOCKET s, u16 reg)
|
||||
{
|
||||
u8 i;
|
||||
|
||||
HAL_GPIO_WritePin(W5500_SCS_PORT, W5500_SCS, GPIO_PIN_RESET); // <20><>W5500<30><30>SCSΪ<53>͵<EFBFBD>ƽ
|
||||
|
||||
SPI1_Send_Short(reg); // ͨ<><CDA8>SPI1д16λ<36>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
SPI1_Send_Byte(FDM1 | RWB_READ | (s * 0x20 + 0x08)); // ͨ<><CDA8>SPI1д<31><D0B4><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>,1<><31><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,ѡ<><D1A1><EFBFBD>˿<EFBFBD>s<EFBFBD>ļĴ<C4BC><C4B4><EFBFBD>
|
||||
|
||||
i = hspi1.Instance->DR;
|
||||
// i=SPI_I2S_ReceiveData(SPI1);
|
||||
SPI1_Send_Byte(0x00); // <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
i = hspi1.Instance->DR;
|
||||
// i=SPI_I2S_ReceiveData(SPI1);//<2F><>ȡ1<C8A1><31><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
HAL_GPIO_WritePin(W5500_SCS_PORT, W5500_SCS, GPIO_PIN_SET); // <20><>W5500<30><30>SCSΪ<53>ߵ<EFBFBD>ƽ
|
||||
return i; // <20><><EFBFBD>ض<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : Read_W5500_SOCK_2Byte
|
||||
* <20><><EFBFBD><EFBFBD> : <20><>W5500ָ<30><D6B8><EFBFBD>˿ڼĴ<DABC><C4B4><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD> : s:<3A>˿ں<CBBF>,reg:16λ<36>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
* <20><><EFBFBD><EFBFBD> : <20><>
|
||||
* <20><><EFBFBD><EFBFBD>ֵ : <20><>ȡ<EFBFBD><C8A1><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>(16λ)
|
||||
* ˵<><CBB5> : <20><>
|
||||
*******************************************************************************/
|
||||
u16 Read_W5500_SOCK_2Byte(SOCKET s, u16 reg)
|
||||
{
|
||||
u16 i;
|
||||
|
||||
HAL_GPIO_WritePin(W5500_SCS_PORT, W5500_SCS, GPIO_PIN_RESET); // <20><>W5500<30><30>SCSΪ<53>͵<EFBFBD>ƽ
|
||||
|
||||
SPI1_Send_Short(reg); // ͨ<><CDA8>SPI1д16λ<36>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
SPI1_Send_Byte(FDM2 | RWB_READ | (s * 0x20 + 0x08)); // ͨ<><CDA8>SPI1д<31><D0B4><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>,2<><32><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,ѡ<><D1A1><EFBFBD>˿<EFBFBD>s<EFBFBD>ļĴ<C4BC><C4B4><EFBFBD>
|
||||
|
||||
i = hspi1.Instance->DR;
|
||||
// i=SPI_I2S_ReceiveData(SPI1);
|
||||
SPI1_Send_Byte(0x00); // <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
i = hspi1.Instance->DR;
|
||||
// i=SPI_I2S_ReceiveData(SPI1);//<2F><>ȡ<EFBFBD><C8A1>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
|
||||
SPI1_Send_Byte(0x00); // <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
i *= 256;
|
||||
i += hspi1.Instance->DR;
|
||||
// i+=SPI_I2S_ReceiveData(SPI1);//<2F><>ȡ<EFBFBD><C8A1>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
|
||||
|
||||
HAL_GPIO_WritePin(W5500_SCS_PORT, W5500_SCS, GPIO_PIN_SET); // <20><>W5500<30><30>SCSΪ<53>ߵ<EFBFBD>ƽ
|
||||
return i; // <20><><EFBFBD>ض<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : Read_SOCK_Data_Buffer
|
||||
* <20><><EFBFBD><EFBFBD> : <20><>W5500<30><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD> : s:<3A>˿ں<CBBF>,*dat_ptr:<3A><><EFBFBD>ݱ<EFBFBD><DDB1>滺<EFBFBD><E6BBBA><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
||||
* <20><><EFBFBD><EFBFBD> : <20><>
|
||||
* <20><><EFBFBD><EFBFBD>ֵ : <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>,rx_size<7A><65><EFBFBD>ֽ<EFBFBD>
|
||||
* ˵<><CBB5> : <20><>
|
||||
*******************************************************************************/
|
||||
u16 Read_SOCK_Data_Buffer(SOCKET s, u8 *dat_ptr)
|
||||
{
|
||||
u16 rx_size;
|
||||
u16 offset, offset1;
|
||||
u16 i;
|
||||
u8 j;
|
||||
|
||||
rx_size = Read_W5500_SOCK_2Byte(s, Sn_RX_RSR);
|
||||
if (rx_size == 0)
|
||||
return 0; // û<><C3BB><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (rx_size > 1460)
|
||||
rx_size = 1460;
|
||||
|
||||
offset = Read_W5500_SOCK_2Byte(s, Sn_RX_RD);
|
||||
offset1 = offset;
|
||||
offset &= (S_RX_SIZE - 1); // <20><><EFBFBD><EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
|
||||
HAL_GPIO_WritePin(W5500_SCS_PORT, W5500_SCS, GPIO_PIN_RESET); // <20><>W5500<30><30>SCSΪ<53>͵<EFBFBD>ƽ
|
||||
|
||||
SPI1_Send_Short(offset); // д16λ<36><CEBB>ַ
|
||||
SPI1_Send_Byte(VDM | RWB_READ | (s * 0x20 + 0x18)); // д<><D0B4><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>,N<><4E><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,ѡ<><D1A1><EFBFBD>˿<EFBFBD>s<EFBFBD>ļĴ<C4BC><C4B4><EFBFBD>
|
||||
j = hspi1.Instance->DR;
|
||||
// j=SPI_I2S_ReceiveData(SPI1);
|
||||
|
||||
if ((offset + rx_size) < S_RX_SIZE) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַδ<D6B7><CEB4><EFBFBD><EFBFBD>W5500<30><30><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
{
|
||||
for (i = 0; i < rx_size; i++) // ѭ<><D1AD><EFBFBD><EFBFBD>ȡrx_size<7A><65><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
SPI1_Send_Byte(0x00); // <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
j = hspi1.Instance->DR;
|
||||
// j=SPI_I2S_ReceiveData(SPI1);//<2F><>ȡ1<C8A1><31><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*dat_ptr = j; // <20><><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><DDB1>浽<EFBFBD><E6B5BD><EFBFBD>ݱ<EFBFBD><DDB1>滺<EFBFBD><E6BBBA><EFBFBD><EFBFBD>
|
||||
dat_ptr++; // <20><><EFBFBD>ݱ<EFBFBD><DDB1>滺<EFBFBD><E6BBBA><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>1
|
||||
}
|
||||
}
|
||||
else // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>W5500<30><30><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
{
|
||||
offset = S_RX_SIZE - offset;
|
||||
for (i = 0; i < offset; i++) // ѭ<><D1AD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>ǰoffset<65><74><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
SPI1_Send_Byte(0x00); // <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
j = hspi1.Instance->DR;
|
||||
// j=SPI_I2S_ReceiveData(SPI1);//<2F><>ȡ1<C8A1><31><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*dat_ptr = j; // <20><><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><DDB1>浽<EFBFBD><E6B5BD><EFBFBD>ݱ<EFBFBD><DDB1>滺<EFBFBD><E6BBBA><EFBFBD><EFBFBD>
|
||||
dat_ptr++; // <20><><EFBFBD>ݱ<EFBFBD><DDB1>滺<EFBFBD><E6BBBA><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>1
|
||||
}
|
||||
HAL_GPIO_WritePin(W5500_SCS_PORT, W5500_SCS, GPIO_PIN_SET); // <20><>W5500<30><30>SCSΪ<53>ߵ<EFBFBD>ƽ
|
||||
|
||||
HAL_GPIO_WritePin(W5500_SCS_PORT, W5500_SCS, GPIO_PIN_RESET); // <20><>W5500<30><30>SCSΪ<53>͵<EFBFBD>ƽ
|
||||
|
||||
SPI1_Send_Short(0x00); // д16λ<36><CEBB>ַ
|
||||
SPI1_Send_Byte(VDM | RWB_READ | (s * 0x20 + 0x18)); // д<><D0B4><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>,N<><4E><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,ѡ<><D1A1><EFBFBD>˿<EFBFBD>s<EFBFBD>ļĴ<C4BC><C4B4><EFBFBD>
|
||||
j = hspi1.Instance->DR;
|
||||
// j=SPI_I2S_ReceiveData(SPI1);
|
||||
|
||||
for (; i < rx_size; i++) // ѭ<><D1AD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>rx_size-offset<65><74><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
SPI1_Send_Byte(0x00); // <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
j = hspi1.Instance->DR;
|
||||
// j=SPI_I2S_ReceiveData(SPI1);//<2F><>ȡ1<C8A1><31><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*dat_ptr = j; // <20><><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><DDB1>浽<EFBFBD><E6B5BD><EFBFBD>ݱ<EFBFBD><DDB1>滺<EFBFBD><E6BBBA><EFBFBD><EFBFBD>
|
||||
dat_ptr++; // <20><><EFBFBD>ݱ<EFBFBD><DDB1>滺<EFBFBD><E6BBBA><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>1
|
||||
}
|
||||
}
|
||||
HAL_GPIO_WritePin(W5500_SCS_PORT, W5500_SCS, GPIO_PIN_SET); // <20><>W5500<30><30>SCSΪ<53>ߵ<EFBFBD>ƽ
|
||||
offset1 += rx_size; // <20><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ,<2C><><EFBFBD>´ζ<C2B4>ȡ<EFBFBD><C8A1><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD>ʼ<EFBFBD><CABC>ַ
|
||||
Write_W5500_SOCK_2Byte(s, Sn_RX_RD, offset1);
|
||||
Write_W5500_SOCK_1Byte(s, Sn_CR, RECV); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
return rx_size; // <20><><EFBFBD>ؽ<EFBFBD><D8BD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD>ݵij<DDB5><C4B3><EFBFBD>
|
||||
}
|
||||
/*******************************************************************************
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : Write_SOCK_Data_Buffer
|
||||
* <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>W5500<30><30><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD> : s:<3A>˿ں<CBBF>,*dat_ptr:<3A><><EFBFBD>ݱ<EFBFBD><DDB1>滺<EFBFBD><E6BBBA><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>,size:<3A><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD>ݵij<DDB5><C4B3><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD> : <20><>
|
||||
* <20><><EFBFBD><EFBFBD>ֵ : <20><>
|
||||
* ˵<><CBB5> : <20><>
|
||||
*******************************************************************************/
|
||||
static void Write_SOCK_Data_Buffer(bsp_W5500_Class_t *pW5500_Class, u8 *dat_ptr, u16 size)
|
||||
{
|
||||
u16 offset, offset1;
|
||||
u16 i;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>UDPģʽ,<2C><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IP<49>Ͷ˿ں<CBBF>
|
||||
if ((Read_W5500_SOCK_1Byte(pW5500_Class->SocketPort, Sn_MR) & 0x0f) != SOCK_UDP) // <20><><EFBFBD><EFBFBD>Socket<65><74><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
||||
{
|
||||
Write_W5500_SOCK_4Byte(pW5500_Class->SocketPort, Sn_DIPR, pW5500_Class->ConfigData.UDP_DIPR); // <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IP
|
||||
Write_W5500_SOCK_2Byte(pW5500_Class->SocketPort, Sn_DPORTR, pW5500_Class->ConfigData.UDP_DPORT[0]<<8 | pW5500_Class->ConfigData.UDP_DPORT[1]); // <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿ں<CBBF>
|
||||
}
|
||||
|
||||
offset = Read_W5500_SOCK_2Byte(pW5500_Class->SocketPort, Sn_TX_WR);
|
||||
offset1 = offset;
|
||||
offset &= (S_TX_SIZE - 1); // <20><><EFBFBD><EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
|
||||
HAL_GPIO_WritePin(W5500_SCS_PORT, W5500_SCS, GPIO_PIN_RESET); // <20><>W5500<30><30>SCSΪ<53>͵<EFBFBD>ƽ
|
||||
|
||||
SPI1_Send_Short(offset); // д16λ<36><CEBB>ַ
|
||||
SPI1_Send_Byte(VDM | RWB_WRITE | (pW5500_Class->SocketPort * 0x20 + 0x10)); // д<><D0B4><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>,N<><4E><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>,д<><D0B4><EFBFBD><EFBFBD>,ѡ<><D1A1><EFBFBD>˿<EFBFBD>s<EFBFBD>ļĴ<C4BC><C4B4><EFBFBD>
|
||||
|
||||
if ((offset + size) < S_TX_SIZE) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַδ<D6B7><CEB4><EFBFBD><EFBFBD>W5500<30><30><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
{
|
||||
for (i = 0; i < size; i++) // ѭ<><D1AD>д<EFBFBD><D0B4>size<7A><65><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
SPI1_Send_Byte(*dat_ptr++); // д<><D0B4>һ<EFBFBD><D2BB><EFBFBD>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
}
|
||||
else // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>W5500<30><30><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
{
|
||||
offset = S_TX_SIZE - offset;
|
||||
for (i = 0; i < offset; i++) // ѭ<><D1AD>д<EFBFBD><D0B4>ǰoffset<65><74><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
SPI1_Send_Byte(*dat_ptr++); // д<><D0B4>һ<EFBFBD><D2BB><EFBFBD>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
HAL_GPIO_WritePin(W5500_SCS_PORT, W5500_SCS, GPIO_PIN_SET); // <20><>W5500<30><30>SCSΪ<53>ߵ<EFBFBD>ƽ
|
||||
|
||||
HAL_GPIO_WritePin(W5500_SCS_PORT, W5500_SCS, GPIO_PIN_RESET); // <20><>W5500<30><30>SCSΪ<53>͵<EFBFBD>ƽ
|
||||
|
||||
SPI1_Send_Short(0x00); // д16λ<36><CEBB>ַ
|
||||
SPI1_Send_Byte(VDM | RWB_WRITE | (pW5500_Class->SocketPort * 0x20 + 0x10)); // д<><D0B4><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>,N<><4E><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>,д<><D0B4><EFBFBD><EFBFBD>,ѡ<><D1A1><EFBFBD>˿<EFBFBD>s<EFBFBD>ļĴ<C4BC><C4B4><EFBFBD>
|
||||
|
||||
for (; i < size; i++) // ѭ<><D1AD>д<EFBFBD><D0B4>size-offset<65><74><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
SPI1_Send_Byte(*dat_ptr++); // д<><D0B4>һ<EFBFBD><D2BB><EFBFBD>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
}
|
||||
HAL_GPIO_WritePin(W5500_SCS_PORT, W5500_SCS, GPIO_PIN_SET); // <20><>W5500<30><30>SCSΪ<53>ߵ<EFBFBD>ƽ
|
||||
|
||||
offset1 += size; // <20><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ,<2C><><EFBFBD>´<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ
|
||||
Write_W5500_SOCK_2Byte(pW5500_Class->SocketPort, Sn_TX_WR, offset1);
|
||||
Write_W5500_SOCK_1Byte(pW5500_Class->SocketPort, Sn_CR, SEND); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : W5500_Hardware_Reset
|
||||
* <20><><EFBFBD><EFBFBD> : Ӳ<><D3B2><EFBFBD><EFBFBD>λW5500
|
||||
* <20><><EFBFBD><EFBFBD> : <20><>
|
||||
* <20><><EFBFBD><EFBFBD> : <20><>
|
||||
* <20><><EFBFBD><EFBFBD>ֵ : <20><>
|
||||
* ˵<><CBB5> : W5500<30>ĸ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ű<EFBFBD><C5B1>ֵ͵<D6B5>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>500us<75><73><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΧW5500
|
||||
*******************************************************************************/
|
||||
void W5500_Hardware_Reset(void)
|
||||
{
|
||||
HAL_GPIO_WritePin(W5500_RST_PORT, W5500_RST, GPIO_PIN_RESET); // <20><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
HAL_Delay(50);
|
||||
HAL_GPIO_WritePin(W5500_RST_PORT, W5500_RST, GPIO_PIN_SET); // <20><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
HAL_Delay(100);
|
||||
|
||||
// while((Read_W5500_1Byte(PHYCFGR)&LINK)==0);//<2F>ȴ<EFBFBD><C8B4><EFBFBD>̫<EFBFBD><CCAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : W5500_Init
|
||||
* <20><><EFBFBD><EFBFBD> : <20><>ʼ<EFBFBD><CABC>W5500<30>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD> : <20><>
|
||||
* <20><><EFBFBD><EFBFBD> : <20><>
|
||||
* <20><><EFBFBD><EFBFBD>ֵ : <20><>
|
||||
* ˵<><CBB5> : <20><>ʹ<EFBFBD><CAB9>W5500֮ǰ<D6AE><C7B0><EFBFBD>ȶ<EFBFBD>W5500<30><30>ʼ<EFBFBD><CABC>
|
||||
*******************************************************************************/
|
||||
void W5500_Init(void)
|
||||
{
|
||||
u16 i = 0;
|
||||
|
||||
Write_W5500_1Byte(MR, RST); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λW5500,<2C><>1<EFBFBD><31>Ч,<2C><>λ<EFBFBD><CEBB><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>0
|
||||
|
||||
HAL_Delay(10); // <20><>ʱ10ms,<2C>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD><C3BA><EFBFBD>
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(Gateway)<29><>IP<49><50>ַ,Gateway_IPΪ4<CEAA>ֽ<EFBFBD>u8<75><38><EFBFBD><EFBFBD>,<2C>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD>
|
||||
// ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD>ؿ<EFBFBD><D8BF><EFBFBD>ʹͨ<CAB9><CDA8>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE>ޣ<EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD>ؿ<EFBFBD><D8BF>Է<EFBFBD><D4B7>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Internet
|
||||
Write_W5500_nByte(GAR, pW5500->Gateway_IP, 4);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(MASK)ֵ,SUB_MASKΪ4<CEAA>ֽ<EFBFBD>u8<75><38><EFBFBD><EFBFBD>,<2C>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
Write_W5500_nByte(SUBR, pW5500->Sub_Mask, 4);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ,PHY_ADDRΪ6<CEAA>ֽ<EFBFBD>u8<75><38><EFBFBD><EFBFBD>,<2C>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>Ψһ<CEA8><D2BB>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD><EFBFBD>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵַ
|
||||
// <20>õ<EFBFBD>ֵַ<D6B7><D6B5>Ҫ<EFBFBD><D2AA>IEEE<45><45><EFBFBD>룬<EFBFBD><EBA3AC><EFBFBD><EFBFBD>OUI<55>Ĺ涨<C4B9><E6B6A8>ǰ3<C7B0><33><EFBFBD>ֽ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>̴<EFBFBD><CCB4>룬<EFBFBD><EBA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>Ϊ<EFBFBD><CEAA>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>ע<EFBFBD><D7A2><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽڱ<D6BD><DAB1><EFBFBD>Ϊż<CEAA><C5BC>
|
||||
Write_W5500_nByte(SHAR, pW5500->Phy_Addr, 6);
|
||||
|
||||
// <20><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD>IP<49><50>ַ,IP_ADDRΪ4<CEAA>ֽ<EFBFBD>u8<75><38><EFBFBD><EFBFBD>,<2C>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD>
|
||||
// ע<>⣬<EFBFBD><E2A3AC><EFBFBD><EFBFBD>IP<49><50><EFBFBD><EFBFBD><EFBFBD>뱾<EFBFBD><EBB1BE>IP<49><50><EFBFBD><EFBFBD>ͬһ<CDAC><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><F2B1BEBB><EFBFBD><EFBFBD><EFBFBD><DEB7>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD>
|
||||
Write_W5500_nByte(SIPR, pW5500->IP_Addr, 4);
|
||||
|
||||
// <20><><EFBFBD>÷<EFBFBD><C3B7>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͽ<EFBFBD><CDBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>С<EFBFBD><D0A1><EFBFBD>ο<EFBFBD>W5500<30><30><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD>
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
Write_W5500_SOCK_1Byte(i, Sn_RXBUF_SIZE, 0x02); // Socket Rx memory size=2k
|
||||
Write_W5500_SOCK_1Byte(i, Sn_TXBUF_SIZE, 0x02); // Socket Tx mempry size=2k
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>䣬Ĭ<E4A3AC><C4AC>Ϊ2000(200ms)
|
||||
// ÿһ<C3BF><D2BB>λ<EFBFBD><CEBB>ֵΪ100<30><CEA2>,<2C><>ʼ<EFBFBD><CABC>ʱֵ<CAB1><D6B5>Ϊ2000(0x07D0),<2C><><EFBFBD><EFBFBD>200<30><30><EFBFBD><EFBFBD>
|
||||
Write_W5500_2Byte(RTR, 0x07d0);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC>Ϊ8<CEAA><38>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>ط<EFBFBD><D8B7>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>趨ֵ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ж<EFBFBD>(<28><><EFBFBD>صĶ˿<C4B6><CBBF>жϼĴ<CFBC><C4B4><EFBFBD><EFBFBD>е<EFBFBD>Sn_IR <20><>ʱλ(TIMEOUT)<29>á<EFBFBD>1<EFBFBD><31>)
|
||||
Write_W5500_1Byte(RCR, 8);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : Detect_Gateway
|
||||
* <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ط<EFBFBD><D8B7><EFBFBD><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD> : <20><>
|
||||
* <20><><EFBFBD><EFBFBD> : <20><>
|
||||
* <20><><EFBFBD><EFBFBD>ֵ : <20>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>TRUE(0xFF),ʧ<>ܷ<EFBFBD><DCB7><EFBFBD>FALSE(0x00)
|
||||
* ˵<><CBB5> : <20><>
|
||||
*******************************************************************************/
|
||||
u8 Detect_Gateway(void)
|
||||
{
|
||||
u8 ip_adde[4];
|
||||
ip_adde[0] = pW5500->IP_Addr[0] + 1;
|
||||
ip_adde[1] = pW5500->IP_Addr[1] + 1;
|
||||
ip_adde[2] = pW5500->IP_Addr[2] + 1;
|
||||
ip_adde[3] = pW5500->IP_Addr[3] + 1;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
Write_W5500_SOCK_4Byte(0, Sn_DIPR, ip_adde); // <20><>Ŀ<EFBFBD>ĵ<EFBFBD>ַ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>д<EFBFBD><D0B4><EFBFBD>뱾<EFBFBD><EBB1BE>IP<49><50>ͬ<EFBFBD><CDAC>IPֵ
|
||||
Write_W5500_SOCK_1Byte(0, Sn_MR, MR_TCP); // <20><><EFBFBD><EFBFBD>socketΪTCPģʽ
|
||||
Write_W5500_SOCK_1Byte(0, Sn_CR, OPEN); // <20><><EFBFBD><EFBFBD>Socket
|
||||
HAL_Delay(5); // <20><>ʱ5ms
|
||||
|
||||
if (Read_W5500_SOCK_1Byte(0, Sn_SR) != SOCK_INIT) // <20><><EFBFBD><EFBFBD>socket<65><74><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
||||
{
|
||||
Write_W5500_SOCK_1Byte(0, Sn_CR, CLOSE); // <20><EFBFBD><F2BFAAB2>ɹ<EFBFBD>,<2C>ر<EFBFBD>Socket
|
||||
return FALSE; // <20><><EFBFBD><EFBFBD>FALSE(0x00)
|
||||
}
|
||||
|
||||
Write_W5500_SOCK_1Byte(0, Sn_CR, CONNECT); // <20><><EFBFBD><EFBFBD>SocketΪConnectģʽ
|
||||
|
||||
do
|
||||
{
|
||||
u16 j = 0;
|
||||
j = Read_W5500_SOCK_1Byte(0, Sn_IR); // <20><>ȡSocket0<74>жϱ<D0B6>־<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||||
if (j != 0)
|
||||
Write_W5500_SOCK_1Byte(0, Sn_IR, j);
|
||||
HAL_Delay(5); // <20><>ʱ5ms
|
||||
if ((j & IR_TIMEOUT) == IR_TIMEOUT)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
else if (Read_W5500_SOCK_1Byte(0, Sn_DHAR) != 0xff)
|
||||
{
|
||||
Write_W5500_SOCK_1Byte(0, Sn_CR, CLOSE); // <20>ر<EFBFBD>Socket
|
||||
return TRUE;
|
||||
}
|
||||
} while (1);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : Socket_Init
|
||||
* <20><><EFBFBD><EFBFBD> : ָ<><D6B8>Socket(0~7)<29><>ʼ<EFBFBD><CABC>
|
||||
* <20><><EFBFBD><EFBFBD> : s:<3A><><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>Ķ˿<C4B6>
|
||||
* <20><><EFBFBD><EFBFBD> : <20><>
|
||||
* <20><><EFBFBD><EFBFBD>ֵ : <20><>
|
||||
* ˵<><CBB5> : <20><>
|
||||
*******************************************************************************/
|
||||
static void bsp_W5500_Socket_Init(bsp_W5500_Class_t *pW5500_Class)
|
||||
{
|
||||
Write_W5500_SOCK_2Byte(pW5500_Class->SocketPort, Sn_MSSR, 1460); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƭ<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>=1460(0x5b4)
|
||||
Write_W5500_SOCK_2Byte(pW5500_Class->SocketPort, Sn_PORT, pW5500_Class->ConfigData.Port[0]<<8 | pW5500_Class->ConfigData.Port[1]);
|
||||
// <20><><EFBFBD>ö˿<C3B6>0Ŀ<30><C4BF>(Զ<><D4B6>)<29>˿ں<CBBF>
|
||||
Write_W5500_SOCK_2Byte(pW5500_Class->SocketPort, Sn_DPORTR, pW5500_Class->ConfigData.DPort[0]<<8 | pW5500_Class->ConfigData.DPort[1]);
|
||||
// <20><><EFBFBD>ö˿<C3B6>0Ŀ<30><C4BF>(Զ<><D4B6>)IP<49><50>ַ
|
||||
Write_W5500_SOCK_4Byte(pW5500_Class->SocketPort, Sn_DIPR, pW5500_Class->ConfigData.DIP);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : Socket_Connect
|
||||
* <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>Socket(0~7)Ϊ<>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD>̷<EFBFBD><CCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD> : s:<3A><><EFBFBD>趨<EFBFBD>Ķ˿<C4B6>
|
||||
* <20><><EFBFBD><EFBFBD> : <20><>
|
||||
* <20><><EFBFBD><EFBFBD>ֵ : <20>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>TRUE(0xFF),ʧ<>ܷ<EFBFBD><DCB7><EFBFBD>FALSE(0x00)
|
||||
* ˵<><CBB5> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Socket<65><74><EFBFBD><EFBFBD><EFBFBD>ڿͻ<DABF><CDBB><EFBFBD>ģʽʱ,<2C><><EFBFBD>øó<C3B8><C3B3><EFBFBD>,<2C><>Զ<EFBFBD>̷<EFBFBD><CCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӻ<EFBFBD><D3BA><EFBFBD><EFBFBD>ֳ<EFBFBD>ʱ<EFBFBD>жϣ<D0B6><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>,<2C><>Ҫ<EFBFBD><D2AA><EFBFBD>µ<EFBFBD><C2B5>øó<C3B8><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* <20>ó<EFBFBD><C3B3><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*******************************************************************************/
|
||||
u8 Socket_Connect(SOCKET s)
|
||||
{
|
||||
Write_W5500_SOCK_1Byte(s, Sn_MR, MR_TCP); // <20><><EFBFBD><EFBFBD>socketΪTCPģʽ
|
||||
Write_W5500_SOCK_1Byte(s, Sn_CR, OPEN); // <20><><EFBFBD><EFBFBD>Socket
|
||||
HAL_Delay(5); // <20><>ʱ5ms
|
||||
if (Read_W5500_SOCK_1Byte(s, Sn_SR) != SOCK_INIT) // <20><><EFBFBD><EFBFBD>socket<65><74><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
||||
{
|
||||
Write_W5500_SOCK_1Byte(s, Sn_CR, CLOSE); // <20><EFBFBD><F2BFAAB2>ɹ<EFBFBD>,<2C>ر<EFBFBD>Socket
|
||||
return FALSE; // <20><><EFBFBD><EFBFBD>FALSE(0x00)
|
||||
}
|
||||
Write_W5500_SOCK_1Byte(s, Sn_CR, CONNECT); // <20><><EFBFBD><EFBFBD>SocketΪConnectģʽ
|
||||
return TRUE; // <20><><EFBFBD><EFBFBD>TRUE,<2C><><EFBFBD>óɹ<C3B3>
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : Socket_Listen
|
||||
* <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>Socket(0~7)<29><>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD> : s:<3A><><EFBFBD>趨<EFBFBD>Ķ˿<C4B6>
|
||||
* <20><><EFBFBD><EFBFBD> : <20><>
|
||||
* <20><><EFBFBD><EFBFBD>ֵ : <20>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>TRUE(0xFF),ʧ<>ܷ<EFBFBD><DCB7><EFBFBD>FALSE(0x00)
|
||||
* ˵<><CBB5> : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Socket<65><74><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD><EFBFBD>ģʽʱ,<2C><><EFBFBD>øó<C3B8><C3B3><EFBFBD>,<2C>ȵ<EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* <20>ó<EFBFBD><C3B3><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>,<2C><>ʹW5500<30><30><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
|
||||
*******************************************************************************/
|
||||
u8 Socket_Listen(SOCKET s)
|
||||
{
|
||||
Write_W5500_SOCK_1Byte(s, Sn_MR, MR_TCP); // <20><><EFBFBD><EFBFBD>socketΪTCPģʽ
|
||||
Write_W5500_SOCK_1Byte(s, Sn_CR, OPEN); // <20><><EFBFBD><EFBFBD>Socket
|
||||
HAL_Delay(5); // <20><>ʱ5ms
|
||||
if (Read_W5500_SOCK_1Byte(s, Sn_SR) != SOCK_INIT) // <20><><EFBFBD><EFBFBD>socket<65><74><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
||||
{
|
||||
Write_W5500_SOCK_1Byte(s, Sn_CR, CLOSE); // <20><EFBFBD><F2BFAAB2>ɹ<EFBFBD>,<2C>ر<EFBFBD>Socket
|
||||
return FALSE; // <20><><EFBFBD><EFBFBD>FALSE(0x00)
|
||||
}
|
||||
Write_W5500_SOCK_1Byte(s, Sn_CR, LISTEN); // <20><><EFBFBD><EFBFBD>SocketΪ<74><CEAA><EFBFBD><EFBFBD>ģʽ
|
||||
HAL_Delay(5); // <20><>ʱ5ms
|
||||
if (Read_W5500_SOCK_1Byte(s, Sn_SR) != SOCK_LISTEN) // <20><><EFBFBD><EFBFBD>socket<65><74><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
||||
{
|
||||
Write_W5500_SOCK_1Byte(s, Sn_CR, CLOSE); // <20><><EFBFBD>ò<EFBFBD><C3B2>ɹ<EFBFBD>,<2C>ر<EFBFBD>Socket
|
||||
return FALSE; // <20><><EFBFBD><EFBFBD>FALSE(0x00)
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Socket<65>Ĵ<C4B4><F2BFAABA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>Զ<EFBFBD>̿ͻ<CCBF><CDBB><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>Ҫ<EFBFBD>ȴ<EFBFBD>Socket<65>жϣ<D0B6>
|
||||
// <20><><EFBFBD>ж<EFBFBD>Socket<65><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD>ο<EFBFBD>W5500<30><30><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD>Socket<65>ж<EFBFBD>״̬
|
||||
// <20>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF>IP<49><50>Ŀ<EFBFBD>Ķ˿ں<CBBF>
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : Socket_UDP
|
||||
* <20><><EFBFBD><EFBFBD> : <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>Socket(0~7)ΪUDPģʽ
|
||||
* <20><><EFBFBD><EFBFBD> : s:<3A><><EFBFBD>趨<EFBFBD>Ķ˿<C4B6>
|
||||
* <20><><EFBFBD><EFBFBD> : <20><>
|
||||
* <20><><EFBFBD><EFBFBD>ֵ : <20>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>TRUE(0xFF),ʧ<>ܷ<EFBFBD><DCB7><EFBFBD>FALSE(0x00)
|
||||
* ˵<><CBB5> : <20><><EFBFBD><EFBFBD>Socket<65><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD>UDPģʽ,<2C><><EFBFBD>øó<C3B8><C3B3><EFBFBD>,<2C><>UDPģʽ<C4A3><CABD>,Socketͨ<74>Ų<EFBFBD><C5B2><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* <20>ó<EFBFBD><C3B3><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD>һ<EFBFBD>Σ<EFBFBD><CEA3><EFBFBD>ʹW5500<30><30><EFBFBD><EFBFBD>ΪUDPģʽ
|
||||
*******************************************************************************/
|
||||
u8 Socket_UDP(SOCKET s)
|
||||
{
|
||||
Write_W5500_SOCK_1Byte(s, Sn_MR, MR_UDP); // <20><><EFBFBD><EFBFBD>SocketΪUDPģʽ*/
|
||||
Write_W5500_SOCK_1Byte(s, Sn_CR, OPEN); // <20><><EFBFBD><EFBFBD>Socket*/
|
||||
HAL_Delay(5); // <20><>ʱ5ms
|
||||
if (Read_W5500_SOCK_1Byte(s, Sn_SR) != SOCK_UDP) // <20><><EFBFBD><EFBFBD>Socket<65><74><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
||||
{
|
||||
Write_W5500_SOCK_1Byte(s, Sn_CR, CLOSE); // <20><EFBFBD><F2BFAAB2>ɹ<EFBFBD>,<2C>ر<EFBFBD>Socket
|
||||
return FALSE; // <20><><EFBFBD><EFBFBD>FALSE(0x00)
|
||||
}
|
||||
else
|
||||
return TRUE;
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Socket<65>Ĵ<C4B4>UDPģʽ<C4A3><CABD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><>ΪSocket<65><74><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IP<49><50>Ŀ<EFBFBD><C4BF>Socket<65>Ķ˿ں<CBBF>
|
||||
// <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IP<49><50>Ŀ<EFBFBD><C4BF>Socket<65>Ķ˿ں<CBBF><DABA>ǹ̶<C7B9><CCB6><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><D0B9><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>иı<D0B8>,<2C><>ôҲ<C3B4><D2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : W5500_Interrupt_Process
|
||||
* <20><><EFBFBD><EFBFBD> : W5500<30>жϴ<D0B6><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD> : <20><>
|
||||
* <20><><EFBFBD><EFBFBD> : <20><>
|
||||
* <20><><EFBFBD><EFBFBD>ֵ : <20><>
|
||||
* ˵<><CBB5> : <20><>
|
||||
*******************************************************************************/
|
||||
static void bsp_W5500_Interrupt_Process(void)
|
||||
{
|
||||
u8 i, j;
|
||||
u8 Int_Flag,Socket_Flag;
|
||||
|
||||
IntDispose:
|
||||
|
||||
Int_Flag = Read_W5500_1Byte(SIR); // <20><>ȡ<EFBFBD>˿<EFBFBD><CBBF>жϱ<D0B6>־<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||||
HAL_Delay(10);
|
||||
for(i=0;i<BSP_W5500_PORT_NUM;i++)
|
||||
{
|
||||
if(Int_Flag & (0x01 << i))
|
||||
{
|
||||
Socket_Flag = Read_W5500_SOCK_1Byte(pW5500->W5500_Class[i].SocketPort, Sn_IR); // <20><>ȡSocket0<74>жϱ<D0B6>־<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||||
Write_W5500_SOCK_1Byte(pW5500->W5500_Class[i].SocketPort, Sn_IR, Socket_Flag);
|
||||
if (Socket_Flag & IR_CON) // <20><>TCPģʽ<C4A3><CABD>,Socket0<74>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
pW5500->W5500_Class[i].Run_State |= BSP_W5500_PORT_RUN_STATE_CONN; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬0x02,<2C>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
if (Socket_Flag & IR_DISCON) // <20><>TCPģʽ<C4A3><CABD>Socket<65>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD>
|
||||
{
|
||||
Write_W5500_SOCK_1Byte(pW5500->W5500_Class[i].SocketPort, Sn_CR, CLOSE); // <20>رն˿<D5B6>,<2C>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>´<EFBFBD><C2B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
bsp_W5500_Socket_Init(&pW5500->W5500_Class[i]); // ָ<><D6B8>Socket(0~7)<29><>ʼ<EFBFBD><CABC>,<2C><>ʼ<EFBFBD><CABC><EFBFBD>˿<EFBFBD>0
|
||||
pW5500->W5500_Class[i].Run_State = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬0x00,<2C>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
|
||||
}
|
||||
if (Socket_Flag & IR_SEND_OK) // Socket0<74><30><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>ٴ<EFBFBD><D9B4><EFBFBD><EFBFBD><EFBFBD>S_tx_process()<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
pW5500->W5500_Class[i].TR_Data_State |= BSP_W5500_PORT_DATA_TRANSMITOK; // <20>˿ڷ<CBBF><DAB7><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
if (Socket_Flag & IR_RECV) // Socket<65><74><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>S_rx_process()<29><><EFBFBD><EFBFBD>
|
||||
{
|
||||
pW5500->W5500_Class[i].TR_Data_State |= BSP_W5500_PORT_DATA_RECEIVE; // <20>˿ڽ<CBBF><DABD>յ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
|
||||
}
|
||||
if (Socket_Flag & IR_TIMEOUT) {
|
||||
// 1. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>жϱ<D0B6>־λ (<28><><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
Write_W5500_SOCK_1Byte(pW5500->W5500_Class[i].SocketPort, Sn_IR, Socket_Flag);
|
||||
|
||||
// 2. ǿ<>ƹر<C6B9>Socket<65><74>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD>λ
|
||||
Write_W5500_SOCK_1Byte(pW5500->W5500_Class[i].SocketPort, Sn_CR, CLOSE);
|
||||
|
||||
// 3. (ǿ<><C7BF><EFBFBD>Ƽ<EFBFBD>) <20><><EFBFBD><EFBFBD>һС<D2BB><D0A1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ȴ<EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD>ɹرղ<D8B1><D5B2><EFBFBD>
|
||||
HAL_Delay(10);
|
||||
|
||||
// 4. <20>ؼ<EFBFBD><D8BC><EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD><C2B4><EFBFBD>Socket<65><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
|
||||
// bsp_W5500_Socket_Init <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Socket<65><74><EFBFBD><EFBFBD>
|
||||
bsp_W5500_Socket_Init(&pW5500->W5500_Class[i]);
|
||||
// bsp_W5500_Socket_Set <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>ģʽ<C4A3><CABD>TCP Server<65><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Socket_Listen
|
||||
bsp_W5500_Socket_Set(&pW5500->W5500_Class[i]);
|
||||
|
||||
// 5. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>״̬<D7B4><CCAC>־λ
|
||||
pW5500->W5500_Class[i].Run_State = 0;
|
||||
pW5500->W5500_Class[i].TR_Data_State = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (Read_W5500_1Byte(SIR) != 0)
|
||||
goto IntDispose;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>Socket<65><74>Keep-Alive<76><65><EFBFBD><EFBFBD>
|
||||
* @param s: Socket<65>˿ں<CBBF> (0~7)
|
||||
* @param interval_5s: <20><><EFBFBD><EFBFBD>ʱ<EFBFBD>䣬<EFBFBD><E4A3AC>λ5<CEBB>룬<EFBFBD><EBA3AC><EFBFBD><EFBFBD>2<EFBFBD><32>ʾ10<31>롣0<EBA1A3><30>ʾ<EFBFBD><CABE><EFBFBD>á<EFBFBD>
|
||||
*/
|
||||
void w5500_set_keepalive(SOCKET s, uint8_t interval_5s)
|
||||
{
|
||||
Write_W5500_SOCK_1Byte(s, Sn_KPALVTR, interval_5s);
|
||||
}
|
||||
|
||||
void bsp_W5500_Socket_Set(bsp_W5500_Class_t *pW5500_Class)
|
||||
{
|
||||
if (0 == pW5500_Class->Run_State)
|
||||
{
|
||||
switch(pW5500_Class->Run_Mode)
|
||||
{
|
||||
/*TCP<43><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ*/
|
||||
case BSP_W5500_PORT_RUN_MODE_TCP_SERVER:
|
||||
{
|
||||
if (Socket_Listen(pW5500_Class->SocketPort) == TRUE)
|
||||
{
|
||||
pW5500_Class->Run_State = BSP_W5500_PORT_RUN_STATE_INIT;
|
||||
w5500_set_keepalive(pW5500_Class->SocketPort, 2);
|
||||
}
|
||||
else
|
||||
pW5500_Class->Run_State = 0;
|
||||
}break;
|
||||
/*TCP<43>ͻ<EFBFBD><CDBB><EFBFBD>ģʽ*/
|
||||
case BSP_W5500_PORT_RUN_MODE_TCP_CLIENT:
|
||||
{
|
||||
if(Socket_Connect(pW5500_Class->SocketPort)==TRUE)
|
||||
pW5500_Class->Run_State = BSP_W5500_PORT_RUN_STATE_INIT;
|
||||
else
|
||||
pW5500_Class->Run_State = 0;
|
||||
}break;
|
||||
/*UDPģʽ*/
|
||||
case BSP_W5500_PORT_RUN_MODE_UDP:
|
||||
{
|
||||
if(Socket_UDP(pW5500_Class->SocketPort)==TRUE)
|
||||
pW5500_Class->Run_State = BSP_W5500_PORT_RUN_STATE_INIT | BSP_W5500_PORT_RUN_STATE_CONN;
|
||||
else
|
||||
pW5500_Class->Run_State = 0;
|
||||
}break;
|
||||
default:break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void bsp_W5500_Init()
|
||||
{
|
||||
u8 i;
|
||||
W5500_Hardware_Reset(); /*Ӳ<><D3B2><EFBFBD><EFBFBD>λW5500*/
|
||||
W5500_Init(); /*<2A><>ʼ<EFBFBD><CABC>W5500<30>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
Detect_Gateway(); /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ط<EFBFBD><D8B7><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
|
||||
for(i=0;i<BSP_W5500_PORT_NUM;i++)
|
||||
{
|
||||
bsp_W5500_Socket_Init(&pW5500->W5500_Class[i]);
|
||||
pW5500->W5500_Class[i].Run_State = 0; /*<2A><>λ״̬*/
|
||||
//bsp_W5500_Socket_Set(&pW5500->W5500_Class[i]); /*W5500<30>˿ڳ<CBBF>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
}
|
||||
}
|
||||
|
||||
static void bsp_W5500_Task(void)
|
||||
{
|
||||
u8 i;
|
||||
for(i=0;i<BSP_W5500_PORT_NUM;i++)
|
||||
{
|
||||
bsp_W5500_Socket_Set(&pW5500->W5500_Class[i]); /*W5500<30>˿ڳ<CBBF>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
}
|
||||
bsp_W5500_Interrupt_Process(); // W5500<30>жϴ<D0B6><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
for(i=0;i<BSP_W5500_PORT_NUM;i++)
|
||||
{
|
||||
if ((pW5500->W5500_Class[i].TR_Data_State & BSP_W5500_PORT_DATA_RECEIVE) == BSP_W5500_PORT_DATA_RECEIVE) // <20><><EFBFBD><EFBFBD>Socket0<74><30><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>
|
||||
{
|
||||
pW5500->W5500_Class[i].TR_Data_State &= ~BSP_W5500_PORT_DATA_RECEIVE;
|
||||
u16 Len = Read_SOCK_Data_Buffer(0, pW5500->W5500_Class[i].Rx_Buffer);
|
||||
// Write_SOCK_Data_Buffer(&pW5500->W5500_Class[i], pW5500->W5500_Class[i].Rx_Buffer, Len);
|
||||
// printf("RX");
|
||||
// Debug_UartSend(pW5500->W5500_Class[i].Rx_Buffer, Len);
|
||||
if(pW5500->W5500_Class[i].Rx_DataAnalysis != NULL)
|
||||
{
|
||||
pW5500->W5500_Class[i].Rx_DataAnalysis(&pW5500->W5500_Class[i],pW5500->W5500_Class[i].Rx_Buffer,Len);/*<2A><><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD>*/
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief <20><>ȡ W5500 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·״̬
|
||||
* @return 1: <20><>·<EFBFBD><C2B7><EFBFBD><EFBFBD>, 0: <20><>·<EFBFBD>Ͽ<EFBFBD>
|
||||
*/
|
||||
static u8 w5500_get_link_status(void)
|
||||
{
|
||||
u8 phycfgr = Read_W5500_1Byte(PHYCFGR); // <20><>ȡ PHYCFGR <20>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||||
return (phycfgr & LINK) ? 1 : 0; // <20><><EFBFBD><EFBFBD> LINK λ
|
||||
}
|
||||
|
||||
|
||||
static void network_monitor_task(void)
|
||||
{
|
||||
u8 current_link = w5500_get_link_status();
|
||||
|
||||
if (last_link_status == 0 && current_link == 1) {
|
||||
/*<2A><>·<EFBFBD>ӶϿ<D3B6><CFBF><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ӣ<EFBFBD>ִ<EFBFBD>лָ<D0BB><D6B8><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
W5500.Init();
|
||||
}
|
||||
|
||||
last_link_status = current_link;
|
||||
}
|
||||
270
usr/bsp/bsp_W5500.h
Normal file
270
usr/bsp/bsp_W5500.h
Normal file
@@ -0,0 +1,270 @@
|
||||
#ifndef _W5500_H_
|
||||
#define _W5500_H_
|
||||
|
||||
#include "main.h"
|
||||
|
||||
/***************** Common Register *****************/
|
||||
#define MR 0x0000
|
||||
#define RST 0x80
|
||||
#define WOL 0x20
|
||||
#define PB 0x10
|
||||
#define PPP 0x08
|
||||
#define FARP 0x02
|
||||
|
||||
#define GAR 0x0001
|
||||
#define SUBR 0x0005
|
||||
#define SHAR 0x0009
|
||||
#define SIPR 0x000f
|
||||
|
||||
#define INTLEVEL 0x0013
|
||||
#define IR 0x0015
|
||||
#define CONFLICT 0x80
|
||||
#define UNREACH 0x40
|
||||
#define PPPOE 0x20
|
||||
#define MP 0x10
|
||||
|
||||
#define IMR 0x0016
|
||||
#define IM_IR7 0x80
|
||||
#define IM_IR6 0x40
|
||||
#define IM_IR5 0x20
|
||||
#define IM_IR4 0x10
|
||||
|
||||
#define SIR 0x0017
|
||||
#define S7_INT 0x80
|
||||
#define S6_INT 0x40
|
||||
#define S5_INT 0x20
|
||||
#define S4_INT 0x10
|
||||
#define S3_INT 0x08
|
||||
#define S2_INT 0x04
|
||||
#define S1_INT 0x02
|
||||
#define S0_INT 0x01
|
||||
|
||||
#define SIMR 0x0018
|
||||
#define S7_IMR 0x80
|
||||
#define S6_IMR 0x40
|
||||
#define S5_IMR 0x20
|
||||
#define S4_IMR 0x10
|
||||
#define S3_IMR 0x08
|
||||
#define S2_IMR 0x04
|
||||
#define S1_IMR 0x02
|
||||
#define S0_IMR 0x01
|
||||
|
||||
#define RTR 0x0019
|
||||
#define RCR 0x001b
|
||||
|
||||
#define PTIMER 0x001c
|
||||
#define PMAGIC 0x001d
|
||||
#define PHA 0x001e
|
||||
#define PSID 0x0024
|
||||
#define PMRU 0x0026
|
||||
|
||||
#define UIPR 0x0028
|
||||
#define UPORT 0x002c
|
||||
|
||||
#define PHYCFGR 0x002e
|
||||
#define RST_PHY 0x80
|
||||
#define OPMODE 0x40
|
||||
#define DPX 0x04
|
||||
#define SPD 0x02
|
||||
#define LINK 0x01
|
||||
|
||||
#define VERR 0x0039
|
||||
|
||||
/********************* Socket Register *******************/
|
||||
#define Sn_MR 0x0000
|
||||
#define MULTI_MFEN 0x80
|
||||
#define BCASTB 0x40
|
||||
#define ND_MC_MMB 0x20
|
||||
#define UCASTB_MIP6B 0x10
|
||||
#define MR_CLOSE 0x00
|
||||
#define MR_TCP 0x01
|
||||
#define MR_UDP 0x02
|
||||
#define MR_MACRAW 0x04
|
||||
|
||||
#define Sn_CR 0x0001
|
||||
#define OPEN 0x01
|
||||
#define LISTEN 0x02
|
||||
#define CONNECT 0x04
|
||||
#define DISCON 0x08
|
||||
#define CLOSE 0x10
|
||||
#define SEND 0x20
|
||||
#define SEND_MAC 0x21
|
||||
#define SEND_KEEP 0x22
|
||||
#define RECV 0x40
|
||||
|
||||
#define Sn_IR 0x0002
|
||||
#define IR_SEND_OK 0x10
|
||||
#define IR_TIMEOUT 0x08
|
||||
#define IR_RECV 0x04
|
||||
#define IR_DISCON 0x02
|
||||
#define IR_CON 0x01
|
||||
|
||||
#define Sn_SR 0x0003
|
||||
#define SOCK_CLOSED 0x00
|
||||
#define SOCK_INIT 0x13
|
||||
#define SOCK_LISTEN 0x14
|
||||
#define SOCK_ESTABLISHED 0x17
|
||||
#define SOCK_CLOSE_WAIT 0x1c
|
||||
#define SOCK_UDP 0x22
|
||||
#define SOCK_MACRAW 0x02
|
||||
|
||||
#define SOCK_SYNSEND 0x15
|
||||
#define SOCK_SYNRECV 0x16
|
||||
#define SOCK_FIN_WAI 0x18
|
||||
#define SOCK_CLOSING 0x1a
|
||||
#define SOCK_TIME_WAIT 0x1b
|
||||
#define SOCK_LAST_ACK 0x1d
|
||||
|
||||
#define Sn_PORT 0x0004
|
||||
#define Sn_DHAR 0x0006
|
||||
#define Sn_DIPR 0x000c
|
||||
#define Sn_DPORTR 0x0010
|
||||
|
||||
#define Sn_MSSR 0x0012
|
||||
#define Sn_TOS 0x0015
|
||||
#define Sn_TTL 0x0016
|
||||
|
||||
#define Sn_RXBUF_SIZE 0x001e
|
||||
#define Sn_TXBUF_SIZE 0x001f
|
||||
#define Sn_TX_FSR 0x0020
|
||||
#define Sn_TX_RD 0x0022
|
||||
#define Sn_TX_WR 0x0024
|
||||
#define Sn_RX_RSR 0x0026
|
||||
#define Sn_RX_RD 0x0028
|
||||
#define Sn_RX_WR 0x002a
|
||||
|
||||
#define Sn_IMR 0x002c
|
||||
#define IMR_SENDOK 0x10
|
||||
#define IMR_TIMEOUT 0x08
|
||||
#define IMR_RECV 0x04
|
||||
#define IMR_DISCON 0x02
|
||||
#define IMR_CON 0x01
|
||||
|
||||
#define Sn_FRAG 0x002d
|
||||
#define Sn_KPALVTR 0x002f
|
||||
|
||||
/*******************************************************************/
|
||||
/************************ SPI Control Byte *************************/
|
||||
/*******************************************************************/
|
||||
/* Operation mode bits */
|
||||
#define VDM 0x00
|
||||
#define FDM1 0x01
|
||||
#define FDM2 0x02
|
||||
#define FDM4 0x03
|
||||
|
||||
/* Read_Write control bit */
|
||||
#define RWB_READ 0x00
|
||||
#define RWB_WRITE 0x04
|
||||
|
||||
/* Block select bits */
|
||||
#define COMMON_R 0x00
|
||||
|
||||
/* Socket 0 */
|
||||
#define S0_REG 0x08
|
||||
#define S0_TX_BUF 0x10
|
||||
#define S0_RX_BUF 0x18
|
||||
|
||||
/* Socket 1 */
|
||||
#define S1_REG 0x28
|
||||
#define S1_TX_BUF 0x30
|
||||
#define S1_RX_BUF 0x38
|
||||
|
||||
/* Socket 2 */
|
||||
#define S2_REG 0x48
|
||||
#define S2_TX_BUF 0x50
|
||||
#define S2_RX_BUF 0x58
|
||||
|
||||
/* Socket 3 */
|
||||
#define S3_REG 0x68
|
||||
#define S3_TX_BUF 0x70
|
||||
#define S3_RX_BUF 0x78
|
||||
|
||||
/* Socket 4 */
|
||||
#define S4_REG 0x88
|
||||
#define S4_TX_BUF 0x90
|
||||
|
||||
/* Socket 5 */
|
||||
#define S5_REG 0xa8
|
||||
#define S5_TX_BUF 0xb0
|
||||
#define S5_RX_BUF 0xb8
|
||||
|
||||
/* Socket 6 */
|
||||
#define S6_REG 0xc8
|
||||
#define S6_TX_BUF 0xd0
|
||||
#define S6_RX_BUF 0xd8
|
||||
|
||||
/* Socket 7 */
|
||||
#define S7_REG 0xe8
|
||||
#define S7_TX_BUF 0xf0
|
||||
#define S7_RX_BUF 0xf8
|
||||
|
||||
#define TRUE 0xff
|
||||
#define FALSE 0x00
|
||||
|
||||
#define S_RX_SIZE 2048 /*<2A><><EFBFBD><EFBFBD>Socket<65><74><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>Ը<EFBFBD><D4B8><EFBFBD>W5500_RMSR<53><52><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
#define S_TX_SIZE 2048 /*<2A><><EFBFBD><EFBFBD>Socket<65><74><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>Ը<EFBFBD><D4B8><EFBFBD>W5500_TMSR<53><52><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
|
||||
/***************----- W5500 GPIO<49><4F><EFBFBD><EFBFBD> -----***************/
|
||||
#define W5500_SCS GPIO_PIN_0 // <20><><EFBFBD><EFBFBD>W5500<30><30>CS<43><53><EFBFBD><EFBFBD>
|
||||
#define W5500_SCS_PORT GPIOB
|
||||
|
||||
#define W5500_RST GPIO_PIN_4 // <20><><EFBFBD><EFBFBD>W5500<30><30>RST<53><54><EFBFBD><EFBFBD>
|
||||
#define W5500_RST_PORT GPIOA
|
||||
|
||||
#define W5500_INT GPIO_PIN_1 // <20><><EFBFBD><EFBFBD>W5500<30><30>INT<4E><54><EFBFBD><EFBFBD>
|
||||
#define W5500_INT_PORT GPIOA
|
||||
|
||||
typedef u8 SOCKET; // <20>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>˿ں<CBBF><DABA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
#define BSP_W5500_PORT_NUM 1
|
||||
|
||||
#define BSP_W5500_TX_DATA_LEN 2048
|
||||
#define BSP_W5500_RX_DATA_LEN 256
|
||||
|
||||
typedef struct bsp_W5500_Class_t bsp_W5500_Class_t;
|
||||
|
||||
struct bsp_W5500_Class_t
|
||||
{
|
||||
SOCKET SocketPort;
|
||||
struct
|
||||
{
|
||||
/***************----- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -----***************/
|
||||
u8 Port[2]; /*<2A>˿<EFBFBD>0<EFBFBD>Ķ˿ں<CBBF>(5000) */
|
||||
u8 DIP[4]; /*<2A>˿<EFBFBD>0Ŀ<30><C4BF>IP<49><50>ַ*/
|
||||
u8 DPort[2]; /*<2A>˿<EFBFBD>0Ŀ<30>Ķ˿ں<CBBF>(6000)*/
|
||||
|
||||
u8 UDP_DIPR[4]; /*UDP(<28>㲥)ģʽ,Ŀ<><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IP<49><50>ַ*/
|
||||
u8 UDP_DPORT[2]; /*UDP(<28>㲥)ģʽ,Ŀ<><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿ں<CBBF>*/
|
||||
}ConfigData;
|
||||
/***************----- <20>˿ڵ<CBBF><DAB5><EFBFBD><EFBFBD><EFBFBD>ģʽ -----***************/
|
||||
u8 Run_Mode;
|
||||
/***************----- <20>˿ڵ<CBBF><DAB5><EFBFBD><EFBFBD><EFBFBD>״̬ -----***************/
|
||||
u8 Run_State;
|
||||
/***************----- <20>˿<EFBFBD><CBBF>շ<EFBFBD><D5B7><EFBFBD><EFBFBD>ݵ<EFBFBD>״̬ -----***********/
|
||||
u8 TR_Data_State;
|
||||
/***************----- <20>˿<EFBFBD><CBBF><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD> -----***************/
|
||||
u8 Rx_Buffer[BSP_W5500_RX_DATA_LEN]; // <20>˿ڽ<CBBF><DABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
|
||||
u8 Tx_Buffer[BSP_W5500_TX_DATA_LEN]; // <20>˿ڷ<CBBF><DAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
u8 Interrupt; // W5500<30>жϱ<D0B6>־(0:<3A><><EFBFBD>ж<EFBFBD>,1:<3A><><EFBFBD>ж<EFBFBD>)
|
||||
|
||||
void (*Rx_DataAnalysis)(bsp_W5500_Class_t *,u8 *,u16 );
|
||||
};
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u8 Gateway_IP[4]; /*<2A><><EFBFBD><EFBFBD>IP<49><50>ַ*/
|
||||
u8 Sub_Mask[4]; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
u8 Phy_Addr[6]; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ(MAC)*/
|
||||
u8 IP_Addr[4]; /*<2A><><EFBFBD><EFBFBD>IP<49><50>ַ*/
|
||||
bsp_W5500_Class_t W5500_Class[BSP_W5500_PORT_NUM]; /*<2A>˿ڳ<CBBF>Ա*/
|
||||
void (*Interrupt_Process)(void); /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
void (*Init)(void); /*<2A><>ʼ<EFBFBD><CABC>*/
|
||||
void (*Task)(void); /*<2A><><EFBFBD><EFBFBD>*/
|
||||
void (*Monitor_task)(void); /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
void (*Socket_Send)(bsp_W5500_Class_t *, u8 *, u16 ); /*<2A>˿ڷ<CBBF><DAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
}bsp_W5500_t;
|
||||
|
||||
|
||||
extern bsp_W5500_t W5500;
|
||||
#endif
|
||||
25
usr/bsp/bsp_Wdg.c
Normal file
25
usr/bsp/bsp_Wdg.c
Normal file
@@ -0,0 +1,25 @@
|
||||
#include "bsp_Wdg.h"
|
||||
|
||||
#include "iwdg.h"
|
||||
|
||||
static void bsp_Wdg_Init(void);
|
||||
static void bsp_Wdg_Feed(void);
|
||||
|
||||
bsp_Wdg_t Wdg =
|
||||
{
|
||||
.Init = bsp_Wdg_Init,
|
||||
.Feed = bsp_Wdg_Feed,
|
||||
};
|
||||
|
||||
bsp_Wdg_t *pWdg = &Wdg;
|
||||
|
||||
static void bsp_Wdg_Init(void)
|
||||
{
|
||||
__HAL_DBGMCU_FREEZE_IWDG(); //<2F><><EFBFBD><EFBFBD>ģʽ<C4A3>£<EFBFBD><C2A3><EFBFBD><EFBFBD>ῴ<EFBFBD>Ź<EFBFBD><C5B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
||||
}
|
||||
|
||||
static void bsp_Wdg_Feed(void)
|
||||
{
|
||||
HAL_IWDG_Refresh(&hiwdg);
|
||||
}
|
||||
|
||||
13
usr/bsp/bsp_Wdg.h
Normal file
13
usr/bsp/bsp_Wdg.h
Normal file
@@ -0,0 +1,13 @@
|
||||
#ifndef _BSP_WDG_H_
|
||||
#define _BSP_WDG_H_
|
||||
|
||||
#include "main.h"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
void (*Init)(void);
|
||||
void (*Feed)(void);
|
||||
}bsp_Wdg_t;
|
||||
|
||||
extern bsp_Wdg_t Wdg;
|
||||
#endif
|
||||
455
usr/bsp/bsp_iap.c
Normal file
455
usr/bsp/bsp_iap.c
Normal file
@@ -0,0 +1,455 @@
|
||||
#include "bsp_iap.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "app.h"
|
||||
|
||||
#include "bsp_uart.h"
|
||||
#include "usr_config.h"
|
||||
|
||||
|
||||
#include "os_timer.h"
|
||||
|
||||
/* IAP ״̬<D7B4><CCAC><EFBFBD><EFBFBD> */
|
||||
#define BSP_IAP_STATE_NOMORAL (0) /* <20><><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>ת */
|
||||
#define BSP_IAP_STATE_UPDATEING (1) /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
#define BSP_IAP_STATE_SUCCEED (2) /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><EFBFBD><D7BC><EFBFBD><EFBFBD>ת */
|
||||
|
||||
/* IAP Э<><D0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡ͷ */
|
||||
#define BSP_IAP_PROTO_RX_HEADER (0x5A)
|
||||
/* IAP Э<><D0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
#define BSP_IAP_PROTO_RX_CMD_GET_SV (0x01) /* <20><>ȡ<EFBFBD>汾<EFBFBD><E6B1BE> */
|
||||
#define BSP_IAP_PROTO_RX_CMD_CODE_SIZE (0x02) /* <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
#define BSP_IAP_PROTO_RX_CMD_WRITE_DATA (0x03) /* д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
#define BSP_IAP_PROTO_RX_CMD_UNKNOW_1 (0x04) /* δ֪<CEB4><D6AA><EFBFBD><EFBFBD>1 */
|
||||
#define BSP_IAP_PROTO_RX_CMD_UNKNOW_2 (0x05) /* δ֪<CEB4><D6AA><EFBFBD><EFBFBD>2 */
|
||||
#define BSP_IAP_PROTO_RX_CMD_UNKNOW_3 (0x06) /* δ֪<CEB4><D6AA><EFBFBD><EFBFBD>3 */
|
||||
|
||||
/* IAP Э<>鷢<EFBFBD><E9B7A2>֡ͷ */
|
||||
#define BSP_IAP_PROTO_TX_HEADER (0xA5)
|
||||
|
||||
/* IAP Э<><D0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
#define BSP_IAP_PROTO_ERROR_CODE_SUCCEED (0) /* <20><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD> */
|
||||
#define BSP_IAP_PROTO_ERROR_CODE_CHECK (1) /* У<><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
#define BSP_IAP_PROTO_ERROR_CODE_CMD (2) /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
#define BSP_IAP_PROTO_ERROR_CODE_LENGTH (3) /* <20><><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD> */
|
||||
|
||||
/* <20><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С */
|
||||
#define BSP_IAP_TX_LEN (32)
|
||||
|
||||
|
||||
|
||||
/* <20><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD> */
|
||||
static u16 bsp_app_time_start; /* <20>ȴ<EFBFBD><C8B4><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ʼʱ<CABC>䣨<EFBFBD><E4A3A8><EFBFBD>룩 */
|
||||
static u8 bsp_iap_tx_buf[BSP_IAP_TX_LEN]; /* <20><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD> */
|
||||
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
static void app_jump(void);
|
||||
static void flash_page_erase(u16 page_num);
|
||||
static void flash_write_u32(u32 write_addr, u32 *p_buffer, u16 num_write);
|
||||
static void flash_write_u8(u32 write_addr, u8 *p_buffer, u16 num_write);
|
||||
static void bsp_iap_send(u8 *p_data, u16 len);
|
||||
static void bsp_iap_rx_task(u8 *p_data, u16 len, void *other_data);
|
||||
static void bsp_iap_init(void);
|
||||
static void bsp_iap_task(void);
|
||||
static u8 sum_check(u8 *p_data, u16 len);
|
||||
|
||||
/******************************************
|
||||
* <20>ṹ<EFBFBD><E1B9B9>: bsp_iap
|
||||
* <20><><EFBFBD><EFBFBD>: IAP <20><><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
|
||||
* <20><><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD> IAP <20>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>úͻص<CDBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
|
||||
*******************************************/
|
||||
bsp_iap_t iap =
|
||||
{
|
||||
.init = bsp_iap_init,
|
||||
.task = bsp_iap_task,
|
||||
};
|
||||
|
||||
/* ȫ<><C8AB>ָ<EFBFBD>룬ָ<EBA3AC><D6B8> IAP <20>ṹ<EFBFBD><E1B9B9> */
|
||||
bsp_iap_t *p_iap = &iap;
|
||||
|
||||
bsp_Uart_t *p_rx_uart;
|
||||
|
||||
/* Ӧ<>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ַ */
|
||||
#define APP_START_ADDR 0x08002800
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD>ֽڣ<D6BD> */
|
||||
#define SECTOR_SIZE FLASH_PAGE_SIZE
|
||||
|
||||
/******************************************
|
||||
* <20><><EFBFBD><EFBFBD>: app_jump
|
||||
* <20><><EFBFBD><EFBFBD>: <20><>ת<EFBFBD><D7AA>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD>: <20><>
|
||||
* <20><><EFBFBD><EFBFBD>: <20><>
|
||||
* <20><><EFBFBD><EFBFBD>: <20>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD><EFBFBD>ö<EFBFBD>ջָ<D5BB>룬<EFBFBD><EBA3AC>ת<EFBFBD><D7AA><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
|
||||
*******************************************/
|
||||
static void app_jump(void)
|
||||
{
|
||||
u32 app_addr = APP_START_ADDR;
|
||||
|
||||
/* <20><><EFBFBD><EFBFBD>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD>ջָ<D5BB><D6B8><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7> */
|
||||
if (((*(u32*)app_addr) & 0x2FFE0000) == 0x20000000)
|
||||
{
|
||||
typedef void (*iapfun)(void);
|
||||
iapfun jump_to_app;
|
||||
/* <20>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD> */
|
||||
__disable_irq();
|
||||
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ӵ<EFBFBD>Ĭ<EFBFBD><C4AC>״̬<D7B4><CCAC>ʹ<EFBFBD><CAB9>HSIʱ<49><CAB1> */
|
||||
HAL_RCC_DeInit();
|
||||
|
||||
// LL_USART_Disable(USART1);
|
||||
// LL_USART_Disable(USART2);
|
||||
//
|
||||
// LL_USART_DisableIT_RXNE_RXFNE(USART1);
|
||||
// LL_USART_DisableIT_RXNE_RXFNE(USART2);
|
||||
|
||||
|
||||
SysTick->CTRL = 0;
|
||||
SysTick->LOAD = 0;
|
||||
SysTick->VAL = 0;
|
||||
|
||||
/* <20>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϹ<D0B6><CFB9><EFBFBD><EFBFBD><EFBFBD>־ */
|
||||
for (u8 i = 0; i < 8; i++)
|
||||
{
|
||||
NVIC->ICER[i]=0xFFFFFFFF;
|
||||
NVIC->ICPR[i]=0xFFFFFFFF;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* <20><>ת<EFBFBD><D7AA>Ӧ<EFBFBD>ó<EFBFBD><C3B3><EFBFBD> */
|
||||
jump_to_app = (iapfun)*(u32*)(app_addr + 4); /* <20><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ */
|
||||
__set_MSP(*(u32*)app_addr); /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջָ<D5BB><D6B8> */
|
||||
__enable_irq();
|
||||
jump_to_app(); /* <20><>ת */
|
||||
while(1);
|
||||
}
|
||||
}
|
||||
|
||||
static void bsp_Flash_FLASH_ErasePage(uint32_t Address)
|
||||
{
|
||||
FLASH_EraseInitTypeDef EraseInitStruct;
|
||||
uint32_t PageError = 0;
|
||||
|
||||
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
|
||||
EraseInitStruct.PageAddress = Address;
|
||||
EraseInitStruct.NbPages = 1;
|
||||
|
||||
HAL_FLASHEx_Erase(&EraseInitStruct, &PageError);
|
||||
}
|
||||
|
||||
/******************************************
|
||||
* <20><><EFBFBD><EFBFBD>: flash_page_erase
|
||||
* <20><><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Flash <20><><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD>: page_num - Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD>: <20><>
|
||||
* <20><><EFBFBD><EFBFBD>: <20><> APP_START_ADDR <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> page_num <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*******************************************/
|
||||
static void flash_page_erase(u16 page_num)
|
||||
{
|
||||
u16 i;
|
||||
|
||||
HAL_FLASH_Unlock();//<2F><><EFBFBD><EFBFBD>
|
||||
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR );
|
||||
for (i = 0; i < page_num; i++)
|
||||
{
|
||||
bsp_Flash_FLASH_ErasePage(i * SECTOR_SIZE+APP_START_ADDR);
|
||||
}
|
||||
|
||||
HAL_FLASH_Lock();//<2F><><EFBFBD><EFBFBD>
|
||||
}
|
||||
|
||||
|
||||
#include <string.h> // ʹ<><CAB9> memcpy
|
||||
|
||||
/**
|
||||
* @brief <20><><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4> Flash<73><68><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1>̣<EFBFBD>
|
||||
* @param write_addr Flash Ŀ<><C4BF><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 8 <20>ֽڶ<D6BD><DAB6>룩
|
||||
* @param code_buffer Դ<><D4B4><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룩
|
||||
* @param size Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
|
||||
*/
|
||||
static void flash_code_write(uint32_t write_addr, uint8_t *code_buffer, uint16_t size)
|
||||
{
|
||||
HAL_FLASH_Unlock();
|
||||
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD>2<EFBFBD>ֽڣ<D6BD>д<EFBFBD><D0B4>
|
||||
for (uint16_t i = 0; i < size; i += 2)
|
||||
{
|
||||
uint16_t data;
|
||||
if (i + 1 < size)
|
||||
data = ((uint16_t)code_buffer[i+1] << 8) | code_buffer[i];
|
||||
else
|
||||
data = (uint16_t)code_buffer[i]; // <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽڣ<D6BD><DAA3><EFBFBD>8λ<38><CEBB>0
|
||||
|
||||
HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, write_addr + i, data);
|
||||
}
|
||||
|
||||
HAL_FLASH_Lock();
|
||||
}
|
||||
|
||||
/******************************************
|
||||
* <20><><EFBFBD><EFBFBD>: bsp_iap_send
|
||||
* <20><><EFBFBD><EFBFBD>: ͨ<><CDA8> UART1 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD>: p_data - <20><><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
||||
* len - <20><><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD>: <20><>
|
||||
* <20><><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD> UART1 <20>ķ<EFBFBD><C4B7>ͽӿ<CDBD>
|
||||
*******************************************/
|
||||
static void bsp_iap_send(u8 *p_data, u16 len)
|
||||
{
|
||||
if(p_rx_uart != NULL)
|
||||
{
|
||||
p_rx_uart->Send(p_rx_uart, p_data, len);
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************
|
||||
* <20><><EFBFBD><EFBFBD>: bsp_iap_init
|
||||
* <20><><EFBFBD><EFBFBD>: IAP <20><>ʼ<EFBFBD><CABC>
|
||||
* <20><><EFBFBD><EFBFBD>: <20><>
|
||||
* <20><><EFBFBD><EFBFBD>: <20><>
|
||||
* <20><><EFBFBD><EFBFBD>: <20><><EFBFBD>ó<EFBFBD>ʼ״̬<D7B4><CCAC><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD>մ<EFBFBD><D5B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*******************************************/
|
||||
static void bsp_iap_init(void)
|
||||
{
|
||||
p_iap->state = BSP_IAP_STATE_NOMORAL;
|
||||
//COM_Uart1.Rx_DataAnalysis = bsp_iap_rx_task;
|
||||
COM_Uart2.Rx_DataAnalysis = bsp_iap_rx_task;
|
||||
}
|
||||
|
||||
/******************************************
|
||||
* <20><><EFBFBD><EFBFBD>: bsp_iap_task
|
||||
* <20><><EFBFBD><EFBFBD>: IAP <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD>е<EFBFBD><D0B5>ã<EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD>: <20><>
|
||||
* <20><><EFBFBD><EFBFBD>: <20><>
|
||||
* <20><><EFBFBD><EFBFBD>: <20><><EFBFBD>ݵ<EFBFBD>ǰ״ִ̬<CCAC><D6B4><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>
|
||||
*******************************************/
|
||||
static void bsp_iap_task(void)
|
||||
{
|
||||
switch (p_iap->state)
|
||||
{
|
||||
case BSP_IAP_STATE_NOMORAL: /* <20><><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>2 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת APP */
|
||||
{
|
||||
if (TIME_TRUE == OsTimer_CheckTimeOut(bsp_app_time_start, osTime_MSecTick, 1000))
|
||||
{
|
||||
app_jump();
|
||||
}
|
||||
} break;
|
||||
|
||||
case BSP_IAP_STATE_UPDATEING: /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
{
|
||||
/* Ԥ<><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܴ<EFBFBD><DCB4><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1> */
|
||||
} break;
|
||||
|
||||
case BSP_IAP_STATE_SUCCEED: /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת */
|
||||
{
|
||||
app_jump();
|
||||
} break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************
|
||||
* <20><><EFBFBD><EFBFBD>: sum_check
|
||||
* <20><><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD>ͣ<EFBFBD><CDA3>ۼӺ<DBBC>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD>: p_data - <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
||||
* len - <20><><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD>: У<><D0A3><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD><EFBFBD>ۼ<EFBFBD><DBBC><EFBFBD><EFBFBD>ͣ<EFBFBD>Ȼ<EFBFBD><C8BB>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룩
|
||||
*******************************************/
|
||||
static u8 sum_check(u8 *p_data, u16 len)
|
||||
{
|
||||
u16 i;
|
||||
u8 sum = 0;
|
||||
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
sum += p_data[i];
|
||||
}
|
||||
return (-sum);
|
||||
}
|
||||
|
||||
/******************************************
|
||||
* <20><><EFBFBD><EFBFBD>: bsp_iap_rx_task
|
||||
* <20><><EFBFBD><EFBFBD>: IAP Э<><D0AD><EFBFBD><EFBFBD><EFBFBD>մ<EFBFBD><D5B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD>: p_data - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
|
||||
* len - <20><><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
||||
* other_data - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>δʹ<CEB4>ã<EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD>: <20><>
|
||||
* <20><><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD> IAP Э<><D0AD>֡<EFBFBD><D6A1>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>ظ<EFBFBD>
|
||||
*******************************************/
|
||||
static void bsp_iap_rx_task(u8 *p_data, u16 len, void *other_data)
|
||||
{
|
||||
u16 i, cmd, data_len, tx_len = 0;
|
||||
u8 check_data, error_code = BSP_IAP_PROTO_ERROR_CODE_SUCCEED;
|
||||
u8 *p_data_offset;
|
||||
|
||||
if(BSP_IAP_STATE_SUCCEED == p_iap->state)/*<2A><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><F3A3ACB2>ٽ<EFBFBD><D9BD>м<EFBFBD><D0BC><EFBFBD>*/
|
||||
{
|
||||
return;
|
||||
}
|
||||
/* ֡ͷ<D6A1><CDB7><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3>ȼ<EFBFBD><C8BC><EFBFBD> */
|
||||
if (p_data[0] != BSP_IAP_PROTO_RX_HEADER || len < 4)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
data_len = p_data[1] << 8 | p_data[2];
|
||||
if (len - 4 != data_len) /* <20><><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD> */
|
||||
{
|
||||
error_code = BSP_IAP_PROTO_ERROR_CODE_LENGTH;
|
||||
}
|
||||
else
|
||||
{
|
||||
check_data = sum_check(p_data, len - 1);
|
||||
if (check_data != p_data[len - 1]) /* У<><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
{
|
||||
error_code = BSP_IAP_PROTO_ERROR_CODE_CHECK;
|
||||
}
|
||||
}
|
||||
|
||||
p_rx_uart = (bsp_Uart_t*)(other_data);
|
||||
cmd = p_data[3];
|
||||
p_data_offset = &p_data[4];
|
||||
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB4A6> */
|
||||
switch (cmd)
|
||||
{
|
||||
case BSP_IAP_PROTO_RX_CMD_GET_SV: /* <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>汾<EFBFBD><E6B1BE> */
|
||||
{
|
||||
u8 str_len, tx_data_len;
|
||||
|
||||
p_iap->state = BSP_IAP_STATE_UPDATEING; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ */
|
||||
|
||||
str_len = strlen(SwVersion) + 1;
|
||||
memcpy(&bsp_iap_tx_buf[3], SwVersion, str_len);
|
||||
tx_data_len = str_len;
|
||||
|
||||
bsp_iap_tx_buf[0] = BSP_IAP_PROTO_TX_HEADER;
|
||||
bsp_iap_tx_buf[1] = tx_data_len + 1;
|
||||
bsp_iap_tx_buf[2] = cmd;
|
||||
bsp_iap_tx_buf[tx_data_len + 3] = sum_check(bsp_iap_tx_buf, bsp_iap_tx_buf[1] + 2);
|
||||
tx_len = bsp_iap_tx_buf[1] + 3;
|
||||
} break;
|
||||
|
||||
case BSP_IAP_PROTO_RX_CMD_CODE_SIZE: /* <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
{
|
||||
u8 tx_data_len;
|
||||
u16 erase_size, erase_page, page_size;
|
||||
|
||||
erase_page = p_data_offset[0] << 8 | p_data_offset[1];
|
||||
page_size = p_data_offset[2] << 8 | p_data_offset[3];
|
||||
p_iap->page_size = page_size;
|
||||
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
erase_page /= ((float)SECTOR_SIZE / (float)page_size);
|
||||
flash_page_erase(erase_page);
|
||||
|
||||
tx_data_len = 0;
|
||||
|
||||
bsp_iap_tx_buf[0] = BSP_IAP_PROTO_TX_HEADER;
|
||||
bsp_iap_tx_buf[1] = tx_data_len + 1;
|
||||
bsp_iap_tx_buf[2] = cmd;
|
||||
bsp_iap_tx_buf[tx_data_len + 3] = sum_check(bsp_iap_tx_buf, bsp_iap_tx_buf[1] + 2);
|
||||
tx_len = bsp_iap_tx_buf[1] + 3;
|
||||
} break;
|
||||
|
||||
case BSP_IAP_PROTO_RX_CMD_WRITE_DATA: /* д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
{
|
||||
u8 tx_data_len;
|
||||
u16 index, code_size, addr_offset, i;
|
||||
u32 addr;
|
||||
u8 *p_code_data;
|
||||
|
||||
index = p_data_offset[0] << 8 | p_data_offset[1];
|
||||
code_size = data_len - 3;
|
||||
|
||||
addr = index * p_iap->page_size;
|
||||
p_code_data = &p_data_offset[2];
|
||||
|
||||
|
||||
flash_code_write(APP_START_ADDR+addr, p_code_data, code_size);
|
||||
|
||||
|
||||
/* <20><><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>֡<EFBFBD><D6A1><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD> */
|
||||
bsp_iap_tx_buf[3] = index >> 8;
|
||||
bsp_iap_tx_buf[4] = index & 0x00ff;
|
||||
tx_data_len = 2;
|
||||
|
||||
bsp_iap_tx_buf[0] = BSP_IAP_PROTO_TX_HEADER;
|
||||
bsp_iap_tx_buf[1] = tx_data_len + 1;
|
||||
bsp_iap_tx_buf[2] = cmd;
|
||||
bsp_iap_tx_buf[tx_data_len + 3] = sum_check(bsp_iap_tx_buf, bsp_iap_tx_buf[1] + 2);
|
||||
tx_len = bsp_iap_tx_buf[1] + 3;
|
||||
} break;
|
||||
|
||||
case BSP_IAP_PROTO_RX_CMD_UNKNOW_1: /* δ֪<CEB4><D6AA><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD> */
|
||||
{
|
||||
u8 tx_data_len;
|
||||
tx_data_len = 0;
|
||||
p_iap->state = BSP_IAP_STATE_SUCCEED; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
bsp_iap_tx_buf[0] = BSP_IAP_PROTO_TX_HEADER;
|
||||
bsp_iap_tx_buf[1] = tx_data_len + 1;
|
||||
bsp_iap_tx_buf[2] = cmd;
|
||||
bsp_iap_tx_buf[tx_data_len + 3] = sum_check(bsp_iap_tx_buf, bsp_iap_tx_buf[1] + 2);
|
||||
tx_len = bsp_iap_tx_buf[1] + 3;
|
||||
} break;
|
||||
|
||||
case BSP_IAP_PROTO_RX_CMD_UNKNOW_3: /* δ֪<CEB4><D6AA><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽڣ<D6BD> */
|
||||
{
|
||||
u8 tx_data_len;
|
||||
tx_data_len = 2;
|
||||
bsp_iap_tx_buf[3] = p_data_offset[0];
|
||||
bsp_iap_tx_buf[4] = p_data_offset[1];
|
||||
bsp_iap_tx_buf[0] = BSP_IAP_PROTO_TX_HEADER;
|
||||
bsp_iap_tx_buf[1] = tx_data_len + 1;
|
||||
bsp_iap_tx_buf[2] = cmd;
|
||||
bsp_iap_tx_buf[tx_data_len + 3] = sum_check(bsp_iap_tx_buf, bsp_iap_tx_buf[1] + 2);
|
||||
tx_len = bsp_iap_tx_buf[1] + 3;
|
||||
} break;
|
||||
|
||||
case BSP_IAP_PROTO_RX_CMD_UNKNOW_2: /* δ֪<CEB4><D6AA><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD> */
|
||||
{
|
||||
u8 tx_data_len;
|
||||
tx_data_len = 0;
|
||||
bsp_iap_tx_buf[0] = BSP_IAP_PROTO_TX_HEADER;
|
||||
bsp_iap_tx_buf[1] = tx_data_len + 1;
|
||||
bsp_iap_tx_buf[2] = cmd;
|
||||
bsp_iap_tx_buf[tx_data_len + 3] = sum_check(bsp_iap_tx_buf, bsp_iap_tx_buf[1] + 2);
|
||||
tx_len = bsp_iap_tx_buf[1] + 3;
|
||||
} break;
|
||||
|
||||
default:
|
||||
{
|
||||
error_code = BSP_IAP_PROTO_ERROR_CODE_CMD;
|
||||
} break;
|
||||
}
|
||||
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
switch (error_code)
|
||||
{
|
||||
case BSP_IAP_PROTO_ERROR_CODE_SUCCEED:
|
||||
{
|
||||
bsp_iap_send(bsp_iap_tx_buf, tx_len);
|
||||
} break;
|
||||
|
||||
case BSP_IAP_PROTO_ERROR_CODE_CHECK:
|
||||
case BSP_IAP_PROTO_ERROR_CODE_CMD:
|
||||
case BSP_IAP_PROTO_ERROR_CODE_LENGTH:
|
||||
{
|
||||
bsp_iap_tx_buf[0] = BSP_IAP_PROTO_TX_HEADER;
|
||||
bsp_iap_tx_buf[1] = 0x01;
|
||||
bsp_iap_tx_buf[2] = cmd;
|
||||
bsp_iap_tx_buf[3] = error_code;
|
||||
bsp_iap_tx_buf[4] = sum_check(bsp_iap_tx_buf, 4);
|
||||
bsp_iap_send(bsp_iap_tx_buf, 5);
|
||||
} break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
32
usr/bsp/bsp_iap.h
Normal file
32
usr/bsp/bsp_iap.h
Normal file
@@ -0,0 +1,32 @@
|
||||
#ifndef _BSP_IAP_H_
|
||||
#define _BSP_IAP_H_
|
||||
|
||||
#include "main.h"
|
||||
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
u8 u8_Data[4];
|
||||
};
|
||||
uint32_t u64_Data;
|
||||
}u64_Temp_n;
|
||||
|
||||
|
||||
/******************************************
|
||||
* <20>ṹ<EFBFBD><E1B9B9>: bsp_iap_t
|
||||
* <20><><EFBFBD><EFBFBD>: IAP <20><><EFBFBD>ƽṹ<C6BD><E1B9B9>
|
||||
* <20><><EFBFBD><EFBFBD>: <20>洢 IAP ״̬<D7B4>ͺ<EFBFBD><CDBA><EFBFBD>ָ<EFBFBD><D6B8>
|
||||
*******************************************/
|
||||
typedef struct
|
||||
{
|
||||
u8 state; /* IAP ״̬ */
|
||||
u16 page_size; /* ҳ<><D2B3><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD>ֽڣ<D6BD> */
|
||||
void (*init)(void); /* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8> */
|
||||
void (*task)(void); /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8> */
|
||||
} bsp_iap_t;
|
||||
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD> */
|
||||
extern bsp_iap_t iap;
|
||||
|
||||
#endif /* _BSP_IAP_H_ */
|
||||
27
usr/bsp/bsp_print.c
Normal file
27
usr/bsp/bsp_print.c
Normal file
@@ -0,0 +1,27 @@
|
||||
#include "bsp_print.h"
|
||||
|
||||
#include "bsp_Uart.h"
|
||||
|
||||
#include "stdio.h"
|
||||
|
||||
|
||||
//#include "wk_usart.h"
|
||||
|
||||
|
||||
|
||||
/*<2A>ض<EFBFBD><D8B6><EFBFBD>fputc<74><63><EFBFBD><EFBFBD>*/
|
||||
int fputc(int ch, FILE *f)
|
||||
{
|
||||
u8 Data = ch;
|
||||
COM_Uart1.Send(&COM_Uart1,&Data,1);
|
||||
}
|
||||
|
||||
void Debug_UartSend(u8 *pData,u16 Len)
|
||||
{
|
||||
//COM_Uart1.Send(&COM_Uart1,pData,Len);
|
||||
}
|
||||
|
||||
void UartSend(u8 ch)
|
||||
{
|
||||
COM_Uart1.Send(&COM_Uart1,&ch,1);
|
||||
}
|
||||
8
usr/bsp/bsp_print.h
Normal file
8
usr/bsp/bsp_print.h
Normal file
@@ -0,0 +1,8 @@
|
||||
#ifndef _BSP_PRINT_H_
|
||||
#define _BSP_PRINT_H_
|
||||
|
||||
#include "main.h"
|
||||
|
||||
void Debug_UartSend(u8 *pData,u16 Len);
|
||||
|
||||
#endif
|
||||
106
usr/bsp/sys.h
Normal file
106
usr/bsp/sys.h
Normal file
@@ -0,0 +1,106 @@
|
||||
#ifndef _SYS_H_
|
||||
#define _SYS_H_
|
||||
|
||||
#include "stm32f1xx.h"
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD>һЩ<D2BB><D0A9><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͷ̹ؼ<CCB9><D8BC><EFBFBD>
|
||||
typedef int64_t s64;
|
||||
typedef int32_t s32;
|
||||
typedef int16_t s16;
|
||||
typedef int8_t s8;
|
||||
|
||||
typedef const int32_t sc32;
|
||||
typedef const int16_t sc16;
|
||||
typedef const int8_t sc8;
|
||||
|
||||
typedef __IO int32_t vs32;
|
||||
typedef __IO int16_t vs16;
|
||||
typedef __IO int8_t vs8;
|
||||
|
||||
typedef __I int32_t vsc32;
|
||||
typedef __I int16_t vsc16;
|
||||
typedef __I int8_t vsc8;
|
||||
|
||||
typedef uint64_t u64;
|
||||
typedef uint32_t u32;
|
||||
typedef uint16_t u16;
|
||||
typedef uint8_t u8;
|
||||
|
||||
typedef const uint32_t uc32;
|
||||
typedef const uint16_t uc16;
|
||||
typedef const uint8_t uc8;
|
||||
|
||||
typedef __IO uint32_t vu32;
|
||||
typedef __IO uint16_t vu16;
|
||||
typedef __IO uint8_t vu8;
|
||||
|
||||
typedef __I uint32_t vuc32;
|
||||
typedef __I uint16_t vuc16;
|
||||
typedef __I uint8_t vuc8;
|
||||
|
||||
|
||||
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
|
||||
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
|
||||
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
|
||||
//IO<49>ڵ<EFBFBD>ַӳ<D6B7><D3B3>
|
||||
#define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C
|
||||
#define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C
|
||||
#define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C
|
||||
#define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C
|
||||
#define GPIOE_ODR_Addr (GPIOE_BASE+12) //0x4001180C
|
||||
#define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C
|
||||
#define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C
|
||||
|
||||
#define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808
|
||||
#define GPIOB_IDR_Addr (GPIOB_BASE+8) //0x40010C08
|
||||
#define GPIOC_IDR_Addr (GPIOC_BASE+8) //0x40011008
|
||||
#define GPIOD_IDR_Addr (GPIOD_BASE+8) //0x40011408
|
||||
#define GPIOE_IDR_Addr (GPIOE_BASE+8) //0x40011808
|
||||
#define GPIOF_IDR_Addr (GPIOF_BASE+8) //0x40011A08
|
||||
#define GPIOG_IDR_Addr (GPIOG_BASE+8) //0x40011E08
|
||||
|
||||
//IO<49>ڲ<EFBFBD><DAB2><EFBFBD>,ֻ<>Ե<EFBFBD>һ<EFBFBD><D2BB>IO<49><4F>!
|
||||
//ȷ<><C8B7>n<EFBFBD><6E>ֵС<D6B5><D0A1>16!
|
||||
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //<2F><><EFBFBD><EFBFBD>
|
||||
#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //<2F><><EFBFBD><EFBFBD>
|
||||
|
||||
#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //<2F><><EFBFBD><EFBFBD>
|
||||
#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //<2F><><EFBFBD><EFBFBD>
|
||||
|
||||
#define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //<2F><><EFBFBD><EFBFBD>
|
||||
#define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //<2F><><EFBFBD><EFBFBD>
|
||||
|
||||
#define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //<2F><><EFBFBD><EFBFBD>
|
||||
#define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //<2F><><EFBFBD><EFBFBD>
|
||||
|
||||
#define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //<2F><><EFBFBD><EFBFBD>
|
||||
#define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //<2F><><EFBFBD><EFBFBD>
|
||||
|
||||
#define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //<2F><><EFBFBD><EFBFBD>
|
||||
#define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //<2F><><EFBFBD><EFBFBD>
|
||||
|
||||
#define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //<2F><><EFBFBD><EFBFBD>
|
||||
#define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //<2F><><EFBFBD><EFBFBD>
|
||||
/////////////////////////////////////////////////////////////////
|
||||
//Ex_NVIC_Configר<67>ö<EFBFBD><C3B6><EFBFBD>
|
||||
#define GPIO_A 0
|
||||
#define GPIO_B 1
|
||||
#define GPIO_C 2
|
||||
#define GPIO_D 3
|
||||
#define GPIO_E 4
|
||||
#define GPIO_F 5
|
||||
#define GPIO_G 6
|
||||
#define FTIR 1 //<2F>½<EFBFBD><C2BD>ش<EFBFBD><D8B4><EFBFBD>
|
||||
#define RTIR 2 //<2F><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD><D8B4><EFBFBD>
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
274
usr/protocol/proto_CS200.c
Normal file
274
usr/protocol/proto_CS200.c
Normal file
@@ -0,0 +1,274 @@
|
||||
#include "proto_CS200.h"
|
||||
#include "proto_Modbus.h"
|
||||
#include "stdio.h"
|
||||
#include "string.h"
|
||||
#include "bsp_Uart.h"
|
||||
|
||||
|
||||
/*CS200<30><30><EFBFBD><EFBFBD>*/
|
||||
#define CS200_RANGE (2.0)
|
||||
|
||||
#define CS200_RANGE_START (0x4000)
|
||||
#define CS200_RANGE_END (0xC000)
|
||||
|
||||
#define CS200_MODBUS_ADDR_GetCurrentData (0x00)
|
||||
#define CS200_MODBUS_ADDR_SetFlow (0x02)
|
||||
|
||||
static void proto_CS200_Init(void);
|
||||
static void proto_CS200_Tx_Task(void);
|
||||
static void proto_CS200_Rx_Task(u8 *pData,u16 Len);
|
||||
static void proto_SetFlow_1(float Value);
|
||||
static void proto_SetFlow_2(float Value);
|
||||
|
||||
|
||||
|
||||
proto_CS200_t CS200 =
|
||||
{
|
||||
.ID_1 = 32,
|
||||
.ID_2 = 33,
|
||||
|
||||
.Init = proto_CS200_Init,
|
||||
.Tx_Task = proto_CS200_Tx_Task,
|
||||
.Rx_Task = proto_CS200_Rx_Task,
|
||||
|
||||
.SetFlow_1 = proto_SetFlow_1,
|
||||
.SetFlow_2 = proto_SetFlow_2,
|
||||
};
|
||||
|
||||
static proto_CS200_t *pCS200 = &CS200;
|
||||
|
||||
|
||||
static void proto_CS200_Init(void)
|
||||
{
|
||||
COM_Uart1.Rx_DataAnalysis = pCS200 ->Rx_Task;
|
||||
}
|
||||
|
||||
static void proto_CS200_Send(u8 *pData,u16 Len)
|
||||
{
|
||||
COM_Uart1.Send(&COM_Uart1,pData,Len);
|
||||
}
|
||||
|
||||
/*<2A><><EFBFBD><EFBFBD>*/
|
||||
static void proto_SetFlow_1(float Value)
|
||||
{
|
||||
float FlowRange;
|
||||
if(0 == pCS200->CurrentData[0].Range_u16)
|
||||
{
|
||||
FlowRange = CS200_RANGE;
|
||||
}
|
||||
else
|
||||
{
|
||||
FlowRange = pCS200->CurrentData[0].Range_u16 / 1000.0;
|
||||
}
|
||||
pCS200->SetFlowValue_1 = CS200_RANGE_START + (float)(CS200_RANGE_END - CS200_RANGE_START) * Value / FlowRange;
|
||||
}
|
||||
|
||||
static void proto_SetFlow_2(float Value)
|
||||
{
|
||||
float FlowRange;
|
||||
if(0 == pCS200->CurrentData[1].Range_u16)
|
||||
{
|
||||
FlowRange = CS200_RANGE;
|
||||
}
|
||||
else
|
||||
{
|
||||
FlowRange = pCS200->CurrentData[1].Range_u16 / 1000.0;
|
||||
}
|
||||
pCS200->SetFlowValue_2 = CS200_RANGE_START + (float)(CS200_RANGE_END - CS200_RANGE_START) * Value / FlowRange;
|
||||
}
|
||||
|
||||
|
||||
/*<2A><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>*/
|
||||
static void proto_CS200_Tx_GetCurrentData(u8 ID)
|
||||
{
|
||||
u16 Addr = CS200_MODBUS_ADDR_GetCurrentData;
|
||||
u8 Len = 14;
|
||||
ModbusReadData(ID,Addr,Len,proto_CS200_Send);
|
||||
}
|
||||
|
||||
static void proto_CS200_Tx_SetFlow_1(void)
|
||||
{
|
||||
u16 Addr = CS200_MODBUS_ADDR_SetFlow;
|
||||
u8 Len = 1;
|
||||
u16 Data[1]= {pCS200->SetFlowValue_1};
|
||||
|
||||
ModbusyWriteOnlData(pCS200->ID_1,Addr,*Data,proto_CS200_Send);
|
||||
}
|
||||
|
||||
static void proto_CS200_Tx_SetFlow_2(void)
|
||||
{
|
||||
u16 Addr = CS200_MODBUS_ADDR_SetFlow;
|
||||
u8 Len = 1;
|
||||
u16 Data[1]= {pCS200->SetFlowValue_2};
|
||||
|
||||
ModbusyWriteOnlData(pCS200->ID_2,Addr,*Data,proto_CS200_Send);
|
||||
}
|
||||
|
||||
static void proto_CS200_Rx_Task(u8 *pData,u16 Len)
|
||||
{
|
||||
u8 SendTimeFlag = 0;
|
||||
|
||||
u8 ModbusID,CMD;
|
||||
u16 CheckCRC16,ModbusCrc;
|
||||
u16 Addr,Data;
|
||||
u32 u32Temp;
|
||||
float FlowTemp;
|
||||
proto_CS2000_CurrentData_t *pCurrentData;
|
||||
|
||||
ModbusID = *pData;
|
||||
CMD = *(pData+1);
|
||||
CheckCRC16 = pData[Len-2] << 8 | pData[Len-1];
|
||||
|
||||
if(ModbusID == pCS200->ID_1)
|
||||
{
|
||||
pCurrentData = &pCS200->CurrentData[0];
|
||||
}
|
||||
else if(ModbusID == pCS200->ID_2)
|
||||
{
|
||||
pCurrentData = &pCS200->CurrentData[1];
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
pCS200->TimeCount = 0;
|
||||
|
||||
if(CMD != 0x03 &&CMD != 0x04 && CMD != 0x06 && CMD != 0x10) return ;
|
||||
|
||||
ModbusCrc = ModbusCrc16(pData,Len-2);
|
||||
ModbusCrc = (ModbusCrc >> 8) | (ModbusCrc << 8);
|
||||
if(CheckCRC16 != ModbusCrc) return ;
|
||||
|
||||
switch(pCS200->State)
|
||||
{
|
||||
case CS200_STATE_Init:
|
||||
{
|
||||
pCS200->State = CS200_STATE_GetCurrentData;
|
||||
}break;
|
||||
case CS200_STATE_GetCurrentData:
|
||||
{
|
||||
pCurrentData->ID = pData[3 ] << 8 | pData[4 ];
|
||||
pCurrentData->BaudRate = pData[5 ] << 8 | pData[6 ];
|
||||
pCurrentData->SetFlow = pData[7 ] << 8 | pData[8 ];
|
||||
pCurrentData->Flow = pData[9] << 8 | pData[10];
|
||||
pCurrentData->Range_u16 = pData[11] << 8 | pData[12]; //<2F><>λml
|
||||
pCurrentData->ValveCmd = pData[13] << 8 | pData[14];
|
||||
|
||||
|
||||
u32Temp = pData[15] << 24 | pData[16] << 16 | pData[17] << 8 | pData[18] << 8;
|
||||
pCurrentData->SumFlow = *((float *)&u32Temp);
|
||||
pCurrentData->SumFlow_Mode = pData[19] << 8 | pData[20];
|
||||
pCurrentData->Parity = pData[21] << 8 | pData[22];
|
||||
pCurrentData->Valve_U = pData[23] << 8 | pData[24];
|
||||
|
||||
u32Temp = pData[25] << 24 | pData[26] << 16 | pData[27] << 8 | pData[28] << 8;
|
||||
pCurrentData->Range_Float = *((float *)&u32Temp);
|
||||
pCurrentData->SoftStartValue = pData[29] << 8 | pData[30];
|
||||
|
||||
FlowTemp = pCurrentData->Flow;
|
||||
|
||||
pCurrentData->RealFlow = pCurrentData->Range_u16 / 1000.0 * (FlowTemp - CS200_RANGE_START) / ((float)(CS200_RANGE_END - CS200_RANGE_START));
|
||||
|
||||
|
||||
if(pCS200->SetFlowValue_1 != pCS200->CurrentData[0].SetFlow)
|
||||
{
|
||||
pCS200->State = CS200_STATE_SetFlow_1;
|
||||
pCS200->ReadState = CS200_READ_STATE_ID_1;
|
||||
}
|
||||
else if(pCS200->SetFlowValue_2 != pCS200->CurrentData[1].SetFlow)
|
||||
{
|
||||
pCS200->State = CS200_STATE_SetFlow_2;
|
||||
pCS200->ReadState = CS200_READ_STATE_ID_2;
|
||||
}
|
||||
SendTimeFlag = 1;
|
||||
}break;
|
||||
case CS200_STATE_SetFlow_1:
|
||||
{
|
||||
pCS200->State = CS200_STATE_GetCurrentData;
|
||||
}break;
|
||||
case CS200_STATE_SetFlow_2:
|
||||
{
|
||||
pCS200->State = CS200_STATE_GetCurrentData;
|
||||
}break;
|
||||
}
|
||||
if(SendTimeFlag)
|
||||
{
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
pCS200->ErrorFlag &= (~(0x00000001 << pCS200->State));/*<2A><><EFBFBD><EFBFBD><EFBFBD>쳣״̬*/
|
||||
pCS200->SendTime = 0;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
static void proto_CS200_Tx_Task(void)
|
||||
{
|
||||
u8 SendTimeFlag = 0;
|
||||
|
||||
if(++pCS200->TimeCount > 50)/*ͨѶ<CDA8><D1B6>ʱ*/
|
||||
{
|
||||
memset(&pCS200->CurrentData,0,sizeof(pCS200->CurrentData));
|
||||
}
|
||||
|
||||
switch(pCS200->State)
|
||||
{
|
||||
case CS200_STATE_Init:
|
||||
{
|
||||
|
||||
}break;
|
||||
case CS200_STATE_GetCurrentData:
|
||||
{
|
||||
switch(pCS200->ReadState)
|
||||
{
|
||||
case CS200_READ_STATE_ID_1:
|
||||
{
|
||||
proto_CS200_Tx_GetCurrentData(pCS200->ID_1);
|
||||
pCS200->ReadState = CS200_READ_STATE_ID_2;
|
||||
}break;
|
||||
case CS200_READ_STATE_ID_2:
|
||||
{
|
||||
proto_CS200_Tx_GetCurrentData(pCS200->ID_2);
|
||||
pCS200->ReadState = CS200_READ_STATE_ID_1;
|
||||
}break;
|
||||
default:
|
||||
{
|
||||
proto_CS200_Tx_GetCurrentData(pCS200->ID_1);
|
||||
pCS200->ReadState = CS200_READ_STATE_ID_2;
|
||||
}break;
|
||||
}
|
||||
|
||||
SendTimeFlag = 1;
|
||||
}break;
|
||||
case CS200_STATE_SetFlow_1:
|
||||
{
|
||||
proto_CS200_Tx_SetFlow_1();
|
||||
}break;
|
||||
case CS200_STATE_SetFlow_2:
|
||||
{
|
||||
proto_CS200_Tx_SetFlow_2();
|
||||
}break;
|
||||
default:
|
||||
{
|
||||
|
||||
}break;
|
||||
}
|
||||
if(SendTimeFlag)
|
||||
{
|
||||
return ;
|
||||
}
|
||||
else
|
||||
{
|
||||
pCS200->SendTime++;
|
||||
if(pCS200->SendTime >= 3)
|
||||
{
|
||||
pCS200->ErrorFlag |= (0x00000001 << pCS200->State);/*<2A><>¼<EFBFBD>쳣״̬*/
|
||||
pCS200->SendTime = 0;
|
||||
pCS200->State = CS200_STATE_GetCurrentData;
|
||||
}
|
||||
}
|
||||
}
|
||||
58
usr/protocol/proto_CS200.h
Normal file
58
usr/protocol/proto_CS200.h
Normal file
@@ -0,0 +1,58 @@
|
||||
#ifndef _PROTO_CS200_H_
|
||||
#define _PROTO_CS200_H_
|
||||
|
||||
#include "main.h"
|
||||
#include "proto_Modbus.h"
|
||||
|
||||
#define CS200_STATE_Init 0
|
||||
#define CS200_STATE_GetCurrentData 1
|
||||
#define CS200_STATE_SetFlow_1 2
|
||||
#define CS200_STATE_SetFlow_2 3
|
||||
|
||||
#define CS200_READ_STATE_ID_1 0
|
||||
#define CS200_READ_STATE_ID_2 1
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u8 ID;
|
||||
u16 BaudRate;
|
||||
u16 SetFlow;
|
||||
u16 Flow;
|
||||
u16 Range_u16;
|
||||
u8 ValveCmd;
|
||||
float SumFlow; //<2F>ۼ<EFBFBD><DBBC><EFBFBD><EFBFBD><EFBFBD>
|
||||
u8 SumFlow_Mode; //<2F>ۼ<EFBFBD><DBBC><EFBFBD><EFBFBD><EFBFBD>ģʽ
|
||||
u8 Parity; //У<><D0A3>λ
|
||||
u16 Valve_U; //<2F><><EFBFBD><EFBFBD>ѹ
|
||||
float Range_Float;
|
||||
float SoftStartValue; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
||||
|
||||
float RealFlow; //ʵ<><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
||||
}proto_CS2000_CurrentData_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
proto_CS2000_CurrentData_t CurrentData[2];
|
||||
u16 ErrorFlag;
|
||||
u8 SendTime;
|
||||
u8 TimeCount;
|
||||
|
||||
u8 ID_1,ID_2;
|
||||
u8 State;
|
||||
u8 ReadState;
|
||||
u16 SetFlowValue_1;
|
||||
u16 SetFlowValue_2;
|
||||
|
||||
void (*Init)(void);
|
||||
void (*Tx_Task)(void);
|
||||
void (*Rx_Task)(u8 *,u16);
|
||||
void (*SetFlow_1)(float);
|
||||
void (*SetFlow_2)(float);
|
||||
}proto_CS200_t;
|
||||
|
||||
|
||||
|
||||
extern proto_CS200_t CS200;
|
||||
|
||||
#endif
|
||||
169
usr/protocol/proto_HSMS.c
Normal file
169
usr/protocol/proto_HSMS.c
Normal file
@@ -0,0 +1,169 @@
|
||||
#include "proto_HSMS.h"
|
||||
|
||||
#include "string.h"
|
||||
#include "stdio.h"
|
||||
|
||||
#include "bsp_print.h"
|
||||
#include "bsp_W5500.h"
|
||||
#include "proto_SECS2.h"
|
||||
|
||||
|
||||
static void proto_HSMS_Init(void);
|
||||
static void proto_W5500_DataAnalysis(bsp_W5500_Class_t *pW5500_Class,u8 *pData,u16 Len);
|
||||
static void proto_HSMS_Rx_DataAnalysis(u8 *pData,u16 Len);
|
||||
static void proto_HSMS_Tx_Rsq(proto_HSMS_Header_Data_t *pHeader_Data,u8 *Tx_Data,u16 Tx_Data_Len,void *OtherData);
|
||||
|
||||
u8 proto_HSMS_Tx_Buffer[1024];
|
||||
|
||||
proto_HSMS_t HSMS =
|
||||
{
|
||||
.Init = proto_HSMS_Init,
|
||||
.Tx_RsqData = proto_HSMS_Tx_Rsq,
|
||||
};
|
||||
|
||||
proto_HSMS_t *pHSMS = &HSMS;
|
||||
|
||||
static void proto_HSMS_Init(void)
|
||||
{
|
||||
W5500.W5500_Class[0].Rx_DataAnalysis = proto_W5500_DataAnalysis;
|
||||
}
|
||||
|
||||
static void proto_HSMS_Send(u8 *pData,u16 Len)
|
||||
{
|
||||
Debug_UartSend(pData, Len);
|
||||
W5500.Socket_Send(&W5500.W5500_Class[0],pData,Len);
|
||||
}
|
||||
|
||||
static void proto_W5500_DataAnalysis(bsp_W5500_Class_t *pW5500_Class,u8 *pData,u16 Len)
|
||||
{
|
||||
proto_HSMS_Rx_DataAnalysis(pData,Len);
|
||||
}
|
||||
|
||||
/*<2A><>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>*/
|
||||
static void proto_HSMS_Tx_Rsq(proto_HSMS_Header_Data_t *pHeader_Data,u8 *Tx_Data,u16 Tx_Data_Len,void *OtherData)
|
||||
{
|
||||
u8 *Tx = proto_HSMS_Tx_Buffer;
|
||||
u16 Len;
|
||||
|
||||
pHeader_Data->Data_Len = 10 + Tx_Data_Len;
|
||||
u32TOu8(pHeader_Data->Data_Len,Tx,PROTO_HSMS_ENDIAN);
|
||||
u16TOu8(pHeader_Data->Device_Id,&Tx[4],PROTO_HSMS_ENDIAN);
|
||||
|
||||
Tx[6] = pHeader_Data->Header_Byte2.ALL_Data;
|
||||
Tx[7] = pHeader_Data->Header_Byte3;
|
||||
Tx[8] = pHeader_Data->PType;
|
||||
Tx[9] = pHeader_Data->SType;
|
||||
u32TOu8(pHeader_Data->Sys_Byte,&Tx[10],PROTO_HSMS_ENDIAN);
|
||||
Len = 14;
|
||||
|
||||
if(NULL != Tx_Data && 0 != Tx_Data_Len)
|
||||
{
|
||||
memcpy(&Tx[Len],Tx_Data,Tx_Data_Len);
|
||||
Len += Tx_Data_Len;
|
||||
}
|
||||
|
||||
|
||||
proto_HSMS_Send(Tx,Len);
|
||||
Debug_UartSend(Tx,Len);
|
||||
}
|
||||
|
||||
void proto_HSMS_Header_DataAnalysis(proto_HSMS_Header_Data_t *pHeader_Data,u8 *pData)
|
||||
{
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD>н<EFBFBD><D0BD><EFBFBD>*/
|
||||
pHeader_Data->Data_Len = u8TOu32(&pData[0],PROTO_HSMS_ENDIAN);
|
||||
pHeader_Data->Device_Id = u8TOu16(&pData[4],PROTO_HSMS_ENDIAN);
|
||||
pHeader_Data->Header_Byte2.ALL_Data = pData[6];
|
||||
pHeader_Data->Header_Byte3 = pData[7];
|
||||
pHeader_Data->PType = pData[8];
|
||||
pHeader_Data->SType = pData[9];
|
||||
pHeader_Data->Sys_Byte = u8TOu32(&pData[10],PROTO_HSMS_ENDIAN);
|
||||
}
|
||||
|
||||
void proto_HSMS_Rx_DataAnalysis(u8 *pData,u16 Len)
|
||||
{
|
||||
if(Len < 14)/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>*/
|
||||
return ;
|
||||
|
||||
proto_HSMS_Header_DataAnalysis(&pHSMS->Rx_Header_Data,pData);
|
||||
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>*/
|
||||
if((pHSMS->Rx_Header_Data.Data_Len + 4) != Len)
|
||||
{
|
||||
return ;
|
||||
}
|
||||
|
||||
/*<2A><><EFBFBD><EFBFBD>SECS2<53><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ*/
|
||||
if(proto_HSMS_PTYPE_SECS2 != pHSMS->Rx_Header_Data.PType)
|
||||
{
|
||||
return ;
|
||||
}
|
||||
|
||||
switch(pHSMS->Rx_Header_Data.SType)
|
||||
{
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ*/
|
||||
case PROTO_HSMS_STYPE_Data_Message :
|
||||
{
|
||||
/*ƥ<><C6A5><EFBFBD>豸ID*/
|
||||
|
||||
if(pHSMS->Flash_ConfigData.Device_Id != pHSMS->Rx_Header_Data.Device_Id)
|
||||
{
|
||||
return;
|
||||
}
|
||||
memcpy(&pHSMS->Tx_Header_Data,&pHSMS->Rx_Header_Data,sizeof(proto_HSMS_Header_Data_t));
|
||||
/*ȥ<><C8A5>HSMSͷ<53><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
SECS2.Rx_DataAnalysis(&pHSMS->Tx_Header_Data,&pData[14],Len-14);
|
||||
|
||||
}break;
|
||||
/*ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
case PROTO_HSMS_STYPE_Select_Req :
|
||||
{
|
||||
memcpy(&pHSMS->Tx_Header_Data,&pHSMS->Rx_Header_Data,sizeof(proto_HSMS_Header_Data_t));
|
||||
pHSMS->Tx_Header_Data.SType = PROTO_HSMS_STYPE_Select_Rsq;
|
||||
proto_HSMS_Tx_Rsq(&pHSMS->Tx_Header_Data,NULL,0,NULL);
|
||||
}break;
|
||||
/*ѡ<><D1A1><EFBFBD><EFBFBD>Ӧ*/
|
||||
case PROTO_HSMS_STYPE_Select_Rsq :
|
||||
{
|
||||
|
||||
}break;
|
||||
/*ȡ<><C8A1>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
case PROTO_HSMS_STYPE_Deselect_Req :
|
||||
{
|
||||
memcpy(&pHSMS->Tx_Header_Data,&pHSMS->Rx_Header_Data,sizeof(proto_HSMS_Header_Data_t));
|
||||
pHSMS->Tx_Header_Data.SType = PROTO_HSMS_STYPE_Deselect_Rsq;
|
||||
proto_HSMS_Tx_Rsq(&pHSMS->Tx_Header_Data,NULL,0,NULL);
|
||||
}break;
|
||||
/*ȡ<><C8A1>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>Ӧ*/
|
||||
case PROTO_HSMS_STYPE_Deselect_Rsq :
|
||||
{
|
||||
|
||||
}break;
|
||||
/*<2A><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
case PROTO_HSMS_STYPE_Linktest_Req :
|
||||
{
|
||||
memcpy(&pHSMS->Tx_Header_Data,&pHSMS->Rx_Header_Data,sizeof(proto_HSMS_Header_Data_t));
|
||||
pHSMS->Tx_Header_Data.SType = PROTO_HSMS_STYPE_Linktest_Rsp;
|
||||
proto_HSMS_Tx_Rsq(&pHSMS->Tx_Header_Data,NULL,0,NULL);
|
||||
}break;
|
||||
/*<2A><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD>Ӧ*/
|
||||
case PROTO_HSMS_STYPE_Linktest_Rsp :
|
||||
{
|
||||
|
||||
}break;
|
||||
/*<2A>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
case PROTO_HSMS_STYPE_Reject_Req :
|
||||
{
|
||||
|
||||
}break;
|
||||
/*<2A>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
case PROTO_HSMS_STYPE_Separate_Req :
|
||||
{
|
||||
|
||||
}break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
63
usr/protocol/proto_HSMS.h
Normal file
63
usr/protocol/proto_HSMS.h
Normal file
@@ -0,0 +1,63 @@
|
||||
#ifndef _PROTO_HSMS_H_
|
||||
#define _PROTO_HSMS_H_
|
||||
|
||||
#include "main.h"
|
||||
#include "proto_Modbus.h"
|
||||
|
||||
#define PROTO_HSMS_ENDIAN BIG_ENDIAN
|
||||
|
||||
/*<2A><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD> PType*/
|
||||
#define proto_HSMS_PTYPE_SECS2 0 /*SECS-II <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ*/
|
||||
|
||||
/*<2A>Ự<EFBFBD><E1BBB0><EFBFBD><EFBFBD> SType*/
|
||||
#define PROTO_HSMS_STYPE_Data_Message 0 /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ*/
|
||||
#define PROTO_HSMS_STYPE_Select_Req 1 /*ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
#define PROTO_HSMS_STYPE_Select_Rsq 2 /*ѡ<><D1A1><EFBFBD><EFBFBD>Ӧ*/
|
||||
#define PROTO_HSMS_STYPE_Deselect_Req 3 /*ȡ<><C8A1>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
#define PROTO_HSMS_STYPE_Deselect_Rsq 4 /*ȡ<><C8A1>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>Ӧ*/
|
||||
#define PROTO_HSMS_STYPE_Linktest_Req 5 /*<2A><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
#define PROTO_HSMS_STYPE_Linktest_Rsp 6 /*<2A><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD>Ӧ*/
|
||||
#define PROTO_HSMS_STYPE_Reject_Req 7 /*<2A>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
#define PROTO_HSMS_STYPE_Separate_Req 9 /*<2A>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32 Data_Len; /*<2A>ֽڳ<D6BD><DAB3><EFBFBD>*/
|
||||
u16 Device_Id; /*<2A>Ự/<2F>豸<EFBFBD><E8B1B8>ʶ*/
|
||||
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
u8 Stream: 7;
|
||||
u8 Wait: 1; /*ָ<><D6B8><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ<EFBFBD>ظ<EFBFBD>*/
|
||||
}Analysis_Data;
|
||||
u8 ALL_Data;
|
||||
}Header_Byte2;
|
||||
|
||||
u8 Header_Byte3; /*ͷ<><CDB7><EFBFBD>ֽ<EFBFBD>3*/
|
||||
u8 PType; /*<2A><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>*/
|
||||
u8 SType; /*<2A>Ự<EFBFBD><E1BBB0><EFBFBD><EFBFBD>*/
|
||||
u32 Sys_Byte; /*ϵͳ<CFB5>ֽڣ<D6BD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ID<49><44>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD>ʱ<EFBFBD>жϣ<D0B6><CFA3><EFBFBD>Ӧʱ<D3A6><CAB1><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>Ϊ<EFBFBD>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ɲ<EFBFBD><C9B2>ظ<EFBFBD><D8B8><EFBFBD>4<EFBFBD><34><EFBFBD>ֽڣ<D6BD>*/
|
||||
}proto_HSMS_Header_Data_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u16 Device_Id; /*<2A>Ự/<2F>豸<EFBFBD><E8B1B8>ʶ*/
|
||||
}proto_HSMS_Flash_Data_t;
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
proto_HSMS_Header_Data_t Rx_Header_Data; /*<2A><><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
proto_HSMS_Header_Data_t Tx_Header_Data; /*<2A><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
proto_HSMS_Flash_Data_t Flash_ConfigData; /*<2A><><EFBFBD><EFBFBD>Flash<73><68><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>*/
|
||||
|
||||
void (*Init)(void);
|
||||
void (*Tx_RsqData)(proto_HSMS_Header_Data_t *,u8 *,u16 ,void *);
|
||||
|
||||
}proto_HSMS_t;
|
||||
|
||||
extern proto_HSMS_t HSMS;
|
||||
|
||||
#endif
|
||||
294
usr/protocol/proto_Modbus.c
Normal file
294
usr/protocol/proto_Modbus.c
Normal file
@@ -0,0 +1,294 @@
|
||||
#include "proto_Modbus.h"
|
||||
#include "stdio.h"
|
||||
#include "string.h"
|
||||
#include "bsp_Uart.h"
|
||||
|
||||
u16 ModbusCrc16(u8 *pData, u16 Len)
|
||||
{
|
||||
u16 CRC_16 = 0xffff;
|
||||
u16 i;
|
||||
while(Len--)
|
||||
{
|
||||
CRC_16 = CRC_16^(*pData++);
|
||||
for(i=0; i++<8; )
|
||||
{
|
||||
if(CRC_16&0x0001)
|
||||
{
|
||||
CRC_16 = (CRC_16>>1)^0xa001;
|
||||
}
|
||||
else
|
||||
{
|
||||
CRC_16>>=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return CRC_16;
|
||||
}
|
||||
|
||||
/******************************************
|
||||
* <20><><EFBFBD><EFBFBD>: Float2u16
|
||||
* <20><><EFBFBD><EFBFBD>: <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD>16<31><36><EFBFBD><EFBFBD>16λ
|
||||
* <20><><EFBFBD><EFBFBD>: FloatData : Ҫת<D2AA><D7AA><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD>
|
||||
HorL : <20><><EFBFBD>ظ<EFBFBD>16λ<36><CEBB><EFBFBD>ǵ<EFBFBD>16λ
|
||||
* <20><><EFBFBD><EFBFBD>: <20><><EFBFBD>ض<EFBFBD>Ӧ<EFBFBD>ĸ<EFBFBD>16λ<36><CEBB><EFBFBD>ǵ<EFBFBD>16λ
|
||||
* <20><><EFBFBD><EFBFBD>: <20><>
|
||||
******************************************/
|
||||
u16 FloatTOu16(float FloatData,u8 HorL)
|
||||
{
|
||||
u16 Temp = 0XFFFF;
|
||||
if(HorL == U16_DATA_L)
|
||||
{
|
||||
Temp = *((u32 *)&FloatData) & 0x0000ffff;
|
||||
}
|
||||
else if(HorL == U16_DATA_H)
|
||||
{
|
||||
Temp = ((*((u32 *)&FloatData)) >> 16) & 0x0000ffff;
|
||||
}
|
||||
return Temp;
|
||||
}
|
||||
|
||||
/******************************************
|
||||
* <20><><EFBFBD><EFBFBD>: u32TOu16
|
||||
* <20><><EFBFBD><EFBFBD>: <20><>ȡu32<33>ĸ<EFBFBD>16<31><36><EFBFBD><EFBFBD>16λ
|
||||
* <20><><EFBFBD><EFBFBD>: u32Data : Ҫת<D2AA><D7AA><EFBFBD><EFBFBD>u32
|
||||
HorL : <20><><EFBFBD>ظ<EFBFBD>16λ<36><CEBB><EFBFBD>ǵ<EFBFBD>16λ
|
||||
* <20><><EFBFBD><EFBFBD>: <20><><EFBFBD>ض<EFBFBD>Ӧ<EFBFBD>ĸ<EFBFBD>16λ<36><CEBB><EFBFBD>ǵ<EFBFBD>16λ
|
||||
* <20><><EFBFBD><EFBFBD>: <20><>
|
||||
******************************************/
|
||||
u16 u32TOu16(u32 u32Data,u8 HorL)
|
||||
{
|
||||
u16 Temp = 0XFFFF;
|
||||
if(HorL == U16_DATA_L)
|
||||
{
|
||||
Temp = u32Data & 0x0000ffff;
|
||||
}
|
||||
else if(HorL == U16_DATA_H)
|
||||
{
|
||||
Temp = (u32Data >> 16) & 0x0000ffff;
|
||||
}
|
||||
return Temp;
|
||||
}
|
||||
|
||||
void u32TOu8(u32 u32Data,u8 *pData,u8 Endian)
|
||||
{
|
||||
if(BIG_ENDIAN == Endian)
|
||||
{
|
||||
for(u8 i = 0;i < 4;i++)
|
||||
{
|
||||
pData[i] = (u32Data >> (8 * (3 - i))) & 0xff;
|
||||
}
|
||||
}
|
||||
else if(LITTLE_ENDIAN == Endian)
|
||||
{
|
||||
for(u8 i = 0;i < 4;i++)
|
||||
{
|
||||
pData[i] = (u32Data >> (8 * i)) & 0xff;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void u16TOu8(u16 u16Data,u8 *pData,u8 Endian)
|
||||
{
|
||||
if(BIG_ENDIAN == Endian)
|
||||
{
|
||||
for(u8 i = 0;i < 2;i++)
|
||||
{
|
||||
pData[i] = (u16Data >> (8 * (1 - i))) & 0xff;
|
||||
}
|
||||
}
|
||||
else if(LITTLE_ENDIAN == Endian)
|
||||
{
|
||||
for(u8 i = 0;i < 2;i++)
|
||||
{
|
||||
pData[i] = (u16Data >> (8 * i)) & 0xff;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
float u32TOFloat(u32 u32Data,u8 HorL)
|
||||
{
|
||||
float Temp = 0;
|
||||
Temp = *((float *)&u32Data);
|
||||
return Temp;
|
||||
}
|
||||
|
||||
/*<2A><>u8Endian<61><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD>p_u8Dataת<61><D7AA>Ϊ<EFBFBD><CEAA>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>С<EFBFBD><D0A1><EFBFBD><EFBFBD>*/
|
||||
u32 u8TOu32(u8 *p_u8Data,u8 u8Endian)
|
||||
{
|
||||
u32 Temp = 0;
|
||||
if(BIG_ENDIAN == u8Endian)
|
||||
{
|
||||
for(u8 i = 0;i < 4;i++)
|
||||
{
|
||||
Temp |= p_u8Data[i] << ((3 - i) * 8);
|
||||
}
|
||||
}
|
||||
else if(LITTLE_ENDIAN == u8Endian)
|
||||
{
|
||||
for(u8 i = 0;i < 4;i++)
|
||||
{
|
||||
Temp |= p_u8Data[i] << (i * 8);
|
||||
}
|
||||
}
|
||||
return Temp;
|
||||
}
|
||||
|
||||
/*<2A><>u8Endian<61><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD>p_u8Dataת<61><D7AA>Ϊ<EFBFBD><CEAA>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>С<EFBFBD><D0A1><EFBFBD><EFBFBD>*/
|
||||
u16 u8TOu16(u8 *p_u8Data,u8 u8Endian)
|
||||
{
|
||||
u32 Temp = 0;
|
||||
if(BIG_ENDIAN == u8Endian)
|
||||
{
|
||||
for(u8 i = 0;i < 2;i++)
|
||||
{
|
||||
Temp |= p_u8Data[i] << ((1 - i) * 8);
|
||||
}
|
||||
}
|
||||
else if(LITTLE_ENDIAN == u8Endian)
|
||||
{
|
||||
for(u8 i = 0;i < 2;i++)
|
||||
{
|
||||
Temp |= p_u8Data[i] << (i * 8);
|
||||
}
|
||||
}
|
||||
return Temp;
|
||||
}
|
||||
|
||||
|
||||
/*<2A>ֽڶ<D6BD><DAB6><EFBFBD>ת<EFBFBD><D7AA>*/
|
||||
u32 u32_EndianConv(u32 Data)
|
||||
{
|
||||
u32 TempData = 0;
|
||||
TempData = (((Data >> 0 ) & 0xff) << 24)
|
||||
| (((Data >> 8 ) & 0xff) << 16)
|
||||
| (((Data >> 16) & 0xff) << 8 )
|
||||
| (((Data >> 24) & 0xff) << 0 );
|
||||
return TempData;
|
||||
}
|
||||
|
||||
/*<2A>ֽڶ<D6BD><DAB6><EFBFBD>ת<EFBFBD><D7AA>*/
|
||||
u16 u16_EndianConv(u16 Data)
|
||||
{
|
||||
u16 TempData = 0;
|
||||
TempData = (((Data >> 0) & 0xff) << 8)
|
||||
| (((Data >> 8) & 0xff) << 0);
|
||||
return TempData;
|
||||
}
|
||||
|
||||
|
||||
/******************************************
|
||||
* <20><><EFBFBD><EFBFBD>: ModbusReadData
|
||||
* <20><><EFBFBD><EFBFBD>: MODBUS<55><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD>: Id :MODBUS<55>ӻ<EFBFBD><D3BB><EFBFBD>ַ
|
||||
* Addr :д<><D0B4><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD>ʼ<EFBFBD><CABC>ַ
|
||||
* Num :д<>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* UsartSendBuffer :<3A><><EFBFBD>ڷ<EFBFBD><DAB7>ͺ<EFBFBD><CDBA><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD>: <20><>
|
||||
* <20><><EFBFBD><EFBFBD>: <20><>
|
||||
******************************************/
|
||||
void ModbusReadData(u8 Id,u16 Addr,u16 Num,void (*UsartSendBuffer)(u8 *,u16 ))
|
||||
{
|
||||
u8 Tx[8];
|
||||
u16 CRC16;
|
||||
Tx[0] = Id;
|
||||
Tx[1] = 0x03;
|
||||
Tx[2] = (Addr >> 8) & 0xff;
|
||||
Tx[3] = Addr & 0xff;
|
||||
Tx[4] = (Num >> 8) & 0xff;
|
||||
Tx[5] = Num & 0xff;
|
||||
CRC16 = ModbusCrc16(Tx,6);
|
||||
Tx[6] = CRC16 & 0xff;
|
||||
Tx[7] = (CRC16 >> 8) & 0xff;
|
||||
UsartSendBuffer(Tx,8);
|
||||
}
|
||||
|
||||
/******************************************
|
||||
* <20><><EFBFBD><EFBFBD>: ModbusWriteMultipleData
|
||||
* <20><><EFBFBD><EFBFBD>: MODBUSд<53><D0B4><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD>: Id :MODBUS<55>ӻ<EFBFBD><D3BB><EFBFBD>ַ
|
||||
* Addr :д<><D0B4><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD>ʼ<EFBFBD><CABC>ַ
|
||||
* Num :д<>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* Data :д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* UsartSendBuffer :<3A><><EFBFBD>ڷ<EFBFBD><DAB7>ͺ<EFBFBD><CDBA><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD>: <20><>
|
||||
* <20><><EFBFBD><EFBFBD>: <20><>
|
||||
******************************************/
|
||||
void ModbusWriteMultipleData(u8 ID,u16 Addr,u16 Num,u16 *Data,void (*UsartSendBuffer)(u8 *,u16 ))
|
||||
{
|
||||
u8 Tx[50],i;
|
||||
u16 CRC16;
|
||||
Tx[0] = ID;
|
||||
Tx[1] = 0x10;
|
||||
Tx[2] = (Addr >> 8) & 0xff;
|
||||
Tx[3] = Addr & 0xff;
|
||||
Tx[4] = (Num >> 8) & 0xff;
|
||||
Tx[5] = Num & 0xff;
|
||||
Tx[6] = Num * 2;
|
||||
for(i = 0;i < Tx[6]/2;i++)
|
||||
{
|
||||
Tx[7 + 2 * i] = (Data[i] >> 8) & 0xff;
|
||||
Tx[8 + 2 * i] = Data[i] & 0xff;
|
||||
}
|
||||
CRC16 = ModbusCrc16(Tx,7 + 2 * i);
|
||||
Tx[7 + 2 * i] = CRC16 & 0xff;
|
||||
Tx[8 + 2 * i] = (CRC16 >> 8) & 0xff;
|
||||
UsartSendBuffer(Tx,9 + 2 * i);
|
||||
}
|
||||
|
||||
void ModbusyWriteOnlData(u8 ID,u16 Addr,u16 Value,void (*UsartSendBuffer)(u8 *,u16 ))
|
||||
{
|
||||
u8 Tx[8];
|
||||
u16 CRC16;
|
||||
Tx[0] = ID;
|
||||
Tx[1] = 0x06;
|
||||
Tx[2] = (Addr >> 8) & 0xff;
|
||||
Tx[3] = Addr & 0xff;
|
||||
Tx[4] = (Value >> 8) & 0xff;
|
||||
Tx[5] = Value & 0xff;
|
||||
CRC16 = ModbusCrc16(Tx,6);
|
||||
Tx[6] = CRC16 & 0xff;
|
||||
Tx[7] = (CRC16 >> 8) & 0xff;
|
||||
UsartSendBuffer(Tx,8);
|
||||
}
|
||||
|
||||
|
||||
//01 10 00 02 00 01 02 12 34 CRC
|
||||
//ID Func StartAddress RegNumber wDataAddress
|
||||
u8 ModbusAnalysis(ModbusAnalysisData_t *pModbus, u8 *pData, u16 len)
|
||||
{
|
||||
u16 CRC_16;
|
||||
u16 TempU16;
|
||||
|
||||
if(NULL == pModbus) return 0;
|
||||
if(len < 8) return 0;
|
||||
|
||||
CRC_16 = ModbusCrc16(pData, len-2);
|
||||
TempU16 = *(pData+len-1);
|
||||
TempU16 <<= 8;
|
||||
TempU16 |= *(pData+len-2);
|
||||
if(TempU16 != CRC_16) return 0;
|
||||
|
||||
pModbus->ID = *pData;
|
||||
pModbus->Func = *(pData+1);
|
||||
|
||||
pModbus->StartAddress = (*(pData+2))<<8;
|
||||
pModbus->StartAddress |= *(pData+3);
|
||||
|
||||
/*<2A><><EFBFBD><EFBFBD>дһ<D0B4><D2BB><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>*/
|
||||
if(0x06 == pModbus->Func)
|
||||
{
|
||||
pModbus->wDataAddress = pData+4;
|
||||
}
|
||||
else if(0x10 == pModbus->Func) /*д<><D0B4><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>*/
|
||||
{
|
||||
pModbus->RegNumber = (*(pData+4))<<8;
|
||||
pModbus->RegNumber |= *(pData+5);
|
||||
pModbus->wDataAddress = pData+7;
|
||||
}
|
||||
else
|
||||
{
|
||||
pModbus->RegNumber = (*(pData+4))<<8;
|
||||
pModbus->RegNumber |= *(pData+5);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
66
usr/protocol/proto_Modbus.h
Normal file
66
usr/protocol/proto_Modbus.h
Normal file
@@ -0,0 +1,66 @@
|
||||
#ifndef _PROTO_MODBUS_H_
|
||||
#define _PROTO_MODBUS_H_
|
||||
|
||||
#include "main.h"
|
||||
|
||||
#define MODBUS_DEFAULT_ID (0x01)
|
||||
#define MODBUS_SENDBUF_LEN (512U)
|
||||
|
||||
#define U16_DATA_L (0)//<2F><>16λ
|
||||
#define U16_DATA_H (1)//<2F><>16λ
|
||||
|
||||
#define BIG_ENDIAN (0)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
#define LITTLE_ENDIAN (1)//С<><D0A1><EFBFBD><EFBFBD>
|
||||
|
||||
typedef struct _ModbusCommunicationSendBuf{
|
||||
u8 SendBuffer[MODBUS_SENDBUF_LEN];
|
||||
u16 Len;
|
||||
}ModbusCommunicationSendBuf_t;
|
||||
|
||||
typedef struct _ModbusAnalysisData
|
||||
{
|
||||
u8 ID; /*ModbusID*/
|
||||
u8 Func; /*<2A><><EFBFBD>ܺ<EFBFBD>*/
|
||||
u16 StartAddress; /*<2A><>ʼ<EFBFBD><CABC>ַ*/
|
||||
u16 RegNumber; /*<2A>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
u8 *wDataAddress; /*д<><D0B4><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ*/
|
||||
}ModbusAnalysisData_t;
|
||||
|
||||
typedef enum _ModbusErrorCode
|
||||
{
|
||||
ModbusErrorCode_Success = 0x00,
|
||||
ModbusErrorCode_IllegalFunction = 0x01,
|
||||
ModbusErrorCode_IllegalAddr = 0x02,
|
||||
ModbusErrorCode_IllegalData = 0x03,
|
||||
ModbusErrorCode_DeviceBusy = 0x06
|
||||
}ModbusErrorCode_e;
|
||||
|
||||
typedef struct proto_Modbus_t proto_Modbus_t;
|
||||
struct proto_Modbus_t
|
||||
{
|
||||
u8 ID;
|
||||
u16 (*DataRead)(u16); /*Modbus<75><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
ModbusErrorCode_e (*DataWrite)(u16,u16); /*Modbusд<73><D0B4><EFBFBD><EFBFBD>*/
|
||||
void (*Init)(void); /*<2A><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
void (*Task)(void); /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
void (*DataAnalysis)(u8 *,u16,void *); /*<2A><><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD>*/
|
||||
};
|
||||
|
||||
u16 ModbusCrc16(u8 *pData, u16 Len);
|
||||
u16 FloatTOu16(float FloatData,unsigned char HorL);
|
||||
u16 u32TOu16(u32 u32Data,unsigned char HorL);
|
||||
u32 u8TOu32(u8 *p_u8Data,unsigned char u8Endian);
|
||||
u16 u8TOu16(u8 *p_u8Data,unsigned char u8Endian);
|
||||
|
||||
void u32TOu8(u32 u32Data,u8 *pData,u8 Endian);
|
||||
void u16TOu8(u16 u16Data,u8 *pData,u8 Endian);
|
||||
|
||||
u32 u32_EndianConv(u32 Data);
|
||||
u16 u16_EndianConv(u16 Data);
|
||||
|
||||
void ModbusReadData(u8 Id,u16 Addr,u16 Num,void (*UsartSendBuffer)(u8 *,u16 ));
|
||||
void ModbusWriteMultipleData(u8 ID,u16 Addr,u16 Num,u16 *Data,void (*UsartSendBuffer)(u8 *,u16 ));
|
||||
void ModbusyWriteOnlData(u8 ID,u16 Addr,u16 Value,void (*UsartSendBuffer)(u8 *,u16 ));
|
||||
u8 ModbusAnalysis(ModbusAnalysisData_t *pModbus, u8 *pData, u16 len);
|
||||
|
||||
#endif
|
||||
741
usr/protocol/proto_PM100.c
Normal file
741
usr/protocol/proto_PM100.c
Normal file
@@ -0,0 +1,741 @@
|
||||
#include "proto_PM100.h"
|
||||
#include "proto_Modbus.h"
|
||||
#include "stdio.h"
|
||||
#include "string.h"
|
||||
#include "bsp_Uart.h"
|
||||
#include "os_timer.h"
|
||||
|
||||
char *proto_PM100_Str_WarmingCode[32] =
|
||||
{
|
||||
"Water flow low" ,
|
||||
"" ,
|
||||
"Dil.N2 flow low" ,
|
||||
"BP Drooping" ,
|
||||
"MP Drooping" ,
|
||||
"Casing temp. high" ,
|
||||
"BP-G oil level low" ,
|
||||
"BP-M oil level low" ,
|
||||
"MP-G oil level low" ,
|
||||
"MP-M oil level low" ,
|
||||
"Drv brg temp. high" ,
|
||||
"Drvn brg temp. high" ,
|
||||
"Oil level low" ,
|
||||
"BOX temp.high" ,
|
||||
"N2 valve open" ,
|
||||
"Cooler 1 temp. high" ,
|
||||
"Cooler 2 temp. high" ,
|
||||
"Cooler 3 temp. high" ,
|
||||
"Pump N2 flow low" ,
|
||||
"Exh. N2 flow low" ,
|
||||
"Exh. trap temp. high" ,
|
||||
"Back press. high" ,
|
||||
"Heater error" ,
|
||||
"BP motor temp. high" ,
|
||||
"MP motor temp. high" ,
|
||||
"Driver temp. high" ,
|
||||
"Communication error" ,
|
||||
"Valve error" ,
|
||||
"" ,
|
||||
"" ,
|
||||
"" ,
|
||||
"Other warnings"
|
||||
};
|
||||
|
||||
|
||||
|
||||
char *proto_PM100_Str_AlarmCode[32] =
|
||||
{
|
||||
"Casing temp. HH" ,
|
||||
"BP motor temp. high" ,
|
||||
"MP motor temp. high" ,
|
||||
"Water leakage" ,
|
||||
"BP thermal" ,
|
||||
"MP thermal" ,
|
||||
"" ,
|
||||
"" ,
|
||||
"" ,
|
||||
"Emergency stop(EMS)" ,
|
||||
"MP no current" ,
|
||||
"BP no current" ,
|
||||
"" ,
|
||||
"Back press. high" ,
|
||||
"Power failure" ,
|
||||
"MP driver protection active",
|
||||
"BP driver protection active",
|
||||
"BP overload 2" ,
|
||||
"MP overload 2" ,
|
||||
"BP step out" ,
|
||||
"MP step out" ,
|
||||
"Emergency off(EMO)" ,
|
||||
"Exh. N2 flow low" ,
|
||||
"Water flow low continued" ,
|
||||
"External interlock" ,
|
||||
"" ,
|
||||
"" ,
|
||||
"" ,
|
||||
"" ,
|
||||
"" ,
|
||||
"" ,
|
||||
"Other alarms"
|
||||
};
|
||||
|
||||
static void proto_PM100_Init(void);
|
||||
static void proto_PM100_Tx_Task(void);
|
||||
static void proto_PM100_Rx_Task(u8 *pData,u16 Len,void *other_data);
|
||||
static void proto_PM100_Control_Start(u8 Dev);
|
||||
static void proto_PM100_Control_Stop(u8 Dev);
|
||||
static void proto_PM100_Control_Reset(void);
|
||||
static void proto_PM100_Control_Set_Mode(u8 Mode);
|
||||
static void proto_PM100_Control_Set_Mode_Speed(u8 Dev,u8 Mode,u16 Speed);
|
||||
static void proto_PM100_Alarm_Control_Reset(void);
|
||||
static void proto_PM100_Dev_Status_Control_Reset(void);
|
||||
|
||||
proto_PM100_t PM100 =
|
||||
{
|
||||
.Sys_StateQueue = queue(proto_PM100_Set_Data_t,10),
|
||||
.Sys_State = PROTO_PM100_CMD_GET_STATE_ALARM,
|
||||
.Init = proto_PM100_Init,
|
||||
.Tx_Task = proto_PM100_Tx_Task,
|
||||
.Rx_Task = proto_PM100_Rx_Task,
|
||||
|
||||
.Set_Data.Analog_Code = PROTO_PM100_GET_DATA_CODE,
|
||||
.Alarm_Control.Reset = proto_PM100_Alarm_Control_Reset,
|
||||
.Dev_Status_Control.Reset = proto_PM100_Dev_Status_Control_Reset,
|
||||
|
||||
.Control.Start = proto_PM100_Control_Start,
|
||||
.Control.Stop = proto_PM100_Control_Stop,
|
||||
.Control.Reset = proto_PM100_Control_Reset,
|
||||
.Control.Set_Mode = proto_PM100_Control_Set_Mode,
|
||||
.Control.Set_Speed = proto_PM100_Control_Set_Mode_Speed,
|
||||
};
|
||||
|
||||
static proto_PM100_t *pPM100 = &PM100;
|
||||
|
||||
static void proto_PM100_Init(void)
|
||||
{
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
pPM100->Alarm_Control.StartTime = osTime_MSecTick;
|
||||
pPM100->Dev_Status_Control.StartTime = osTime_MSecTick + 500;
|
||||
COM_Uart3.Rx_DataAnalysis = proto_PM100_Rx_Task;
|
||||
|
||||
/*<2A><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ͱ<EFBFBD><CDB1><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
for (int i = 0; i < 32; i++)
|
||||
{
|
||||
PM100.Opera_Status.alarm_start_str[i][0] = '\0';
|
||||
PM100.Opera_Status.warning_start_str[i][0] = '\0';
|
||||
PM100.Opera_Status.alarm_start_sec[i] = 0;
|
||||
PM100.Opera_Status.warning_start_sec[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void proto_PM100_Send(u8 *pData,u16 Len)
|
||||
{
|
||||
COM_Uart3.Send(&COM_Uart3,pData,Len);
|
||||
}
|
||||
|
||||
static u8 proto_PM100_SysState_Switch(void)
|
||||
{
|
||||
proto_PM100_Set_Data_t Set_Data;
|
||||
if(0 == queue_pop(pPM100->Sys_StateQueue,&Set_Data))
|
||||
{
|
||||
pPM100->Sys_State = PROTO_PM100_CMD_GET_STATE_ALARM;
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
pPM100->Sys_State = Set_Data.Sys_State;
|
||||
memcpy(&pPM100->Set_Data,&Set_Data,sizeof(proto_PM100_Set_Data_t));
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
static void proto_PM100_Alarm_Control_Reset(void)
|
||||
{
|
||||
pPM100->Alarm_Control.Code_Last = ((u64)pPM100->Opera_Status.Warming_Code << 32) | (u64)pPM100->Opera_Status.Alarm_Code;
|
||||
}
|
||||
|
||||
|
||||
static void proto_PM100_Dev_Status_Control_Reset(void)
|
||||
{
|
||||
memcpy(&pPM100->Dev_Status_Control.Opera_Status_Last,&pPM100->Opera_Status,sizeof(proto_PM100_Set_Data_t));
|
||||
}
|
||||
|
||||
static void proto_PM100_Control_Start(u8 Dev)
|
||||
{
|
||||
proto_PM100_Set_Data_t Set_Data;
|
||||
Set_Data.Sys_State = PROTO_PM100_CMD_START;
|
||||
Set_Data.Dev = Dev;
|
||||
queue_push_back(pPM100->Sys_StateQueue,(void *)&Set_Data);
|
||||
}
|
||||
|
||||
static void proto_PM100_Control_Stop(u8 Dev)
|
||||
{
|
||||
proto_PM100_Set_Data_t Set_Data;
|
||||
Set_Data.Sys_State = PROTO_PM100_CMD_STOP;
|
||||
Set_Data.Dev = Dev;
|
||||
queue_push_back(pPM100->Sys_StateQueue,(void *)&Set_Data);
|
||||
}
|
||||
|
||||
|
||||
static void proto_PM100_Control_Reset(void)
|
||||
{
|
||||
proto_PM100_Set_Data_t Set_Data;
|
||||
Set_Data.Sys_State = PROTO_PM100_CMD_RESET;
|
||||
queue_push_back(pPM100->Sys_StateQueue,(void *)&Set_Data);
|
||||
}
|
||||
|
||||
|
||||
static void proto_PM100_Control_Set_Mode(u8 Mode)
|
||||
{
|
||||
proto_PM100_Set_Data_t Set_Data;
|
||||
Set_Data.Sys_State = PROTO_PM100_CMD_SET_MODE;
|
||||
Set_Data.Mode = Mode;
|
||||
queue_push_back(pPM100->Sys_StateQueue,(void *)&Set_Data);
|
||||
}
|
||||
|
||||
static void proto_PM100_Control_Set_Mode_Speed(u8 Dev,u8 Mode,u16 Speed)
|
||||
{
|
||||
proto_PM100_Set_Data_t Set_Data;
|
||||
|
||||
Set_Data.Sys_State = PROTO_PM100_CMD_SET_SPEED;
|
||||
Set_Data.Dev = Dev;
|
||||
Set_Data.Mode = Mode;
|
||||
Set_Data.Speed = Speed;
|
||||
queue_push_back(pPM100->Sys_StateQueue,(void *)&Set_Data);
|
||||
}
|
||||
|
||||
/*<2A><><EFBFBD><EFBFBD>У<EFBFBD><D0A3>*/
|
||||
static u8 proto_PM100_CheckSum(u8 *pData,u16 len)
|
||||
{
|
||||
u16 i;
|
||||
u8 Sum=0;
|
||||
for(i=0;i<len;i++)
|
||||
{
|
||||
Sum += pData[i];
|
||||
}
|
||||
return Sum;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD>豸*/
|
||||
static void proto_PM100_Tx_Start(u8 Dev)
|
||||
{
|
||||
char Tx[20];
|
||||
u16 Len;
|
||||
Tx[0] = PROTO_PM100_FRAME_STRUCT_STX;
|
||||
|
||||
sprintf(&Tx[1],"%s",PROTO_PM100_CMD_STR_START);
|
||||
|
||||
if(PROTO_PM100_DEV_MP == Dev)
|
||||
{
|
||||
Tx[4] = PROTO_PM100_DEV_CHAR_MP;
|
||||
}
|
||||
else if(PROTO_PM100_DEV_BP == Dev)
|
||||
{
|
||||
Tx[4] = PROTO_PM100_DEV_CHAR_BP;
|
||||
}
|
||||
else/*<2A>쳣*/
|
||||
{
|
||||
return ;
|
||||
}
|
||||
Tx[5] = PROTO_PM100_FRAME_STRUCT_ETX;
|
||||
sprintf(&Tx[6],"%02X",proto_PM100_CheckSum((u8 *)Tx,6));
|
||||
Tx[8] = PROTO_PM100_FRAME_STRUCT_CR;
|
||||
Len = 9;
|
||||
proto_PM100_Send((u8*)Tx,Len);
|
||||
}
|
||||
|
||||
/*ֹͣ<CDA3>豸*/
|
||||
static void proto_PM100_Tx_Stop(u8 Dev)
|
||||
{
|
||||
char Tx[20];
|
||||
u16 Len;
|
||||
Tx[0] = PROTO_PM100_FRAME_STRUCT_STX;
|
||||
|
||||
sprintf(&Tx[1],"%s",PROTO_PM100_CMD_STR_STOP);
|
||||
|
||||
if(PROTO_PM100_DEV_MP == Dev)
|
||||
{
|
||||
Tx[4] = PROTO_PM100_DEV_CHAR_MP;
|
||||
}
|
||||
else if(PROTO_PM100_DEV_BP == Dev)
|
||||
{
|
||||
Tx[4] = PROTO_PM100_DEV_CHAR_BP;
|
||||
}
|
||||
else/*<2A>쳣*/
|
||||
{
|
||||
return ;
|
||||
}
|
||||
Tx[5] = PROTO_PM100_FRAME_STRUCT_ETX;
|
||||
sprintf(&Tx[6],"%02X",proto_PM100_CheckSum((u8 *)Tx,6));
|
||||
Tx[8] = PROTO_PM100_FRAME_STRUCT_CR;
|
||||
Len = 9;
|
||||
proto_PM100_Send((u8*)Tx,Len);
|
||||
}
|
||||
|
||||
|
||||
/*<2A><>λ<EFBFBD>豸*/
|
||||
static void proto_PM100_Tx_Reset(void)
|
||||
{
|
||||
char Tx[20];
|
||||
u16 Len;
|
||||
Tx[0] = PROTO_PM100_FRAME_STRUCT_STX;
|
||||
|
||||
sprintf(&Tx[1],"%s",PROTO_PM100_CMD_STR_RESET);
|
||||
|
||||
Tx[4] = PROTO_PM100_FRAME_STRUCT_ETX;
|
||||
|
||||
sprintf(&Tx[5],"%02X",proto_PM100_CheckSum((u8 *)Tx,5));
|
||||
|
||||
Tx[7] = PROTO_PM100_FRAME_STRUCT_CR;
|
||||
|
||||
Len = 8;
|
||||
proto_PM100_Send((u8*)Tx,Len);
|
||||
}
|
||||
|
||||
/*<2A><><EFBFBD><EFBFBD>ģʽ*/
|
||||
static void proto_PM100_Tx_Set_Mode(u8 Mode)
|
||||
{
|
||||
char Tx[20];
|
||||
u16 Len;
|
||||
Tx[0] = PROTO_PM100_FRAME_STRUCT_STX;
|
||||
|
||||
sprintf(&Tx[1],"%s",PROTO_PM100_CMD_STR_SET_MODE);
|
||||
|
||||
if(PROTO_PM100_MODE_NORMAL == Mode)
|
||||
{
|
||||
Tx[4] = PROTO_PM100_MODE_CHAR_NORMAL;
|
||||
}
|
||||
else if(PROTO_PM100_MODE_POWER_SAVING == Mode)
|
||||
{
|
||||
Tx[4] = PROTO_PM100_MODE_CHAR_POWER_SAVING;
|
||||
}
|
||||
else/*<2A>쳣*/
|
||||
{
|
||||
return ;
|
||||
}
|
||||
Tx[5] = PROTO_PM100_FRAME_STRUCT_ETX;
|
||||
sprintf(&Tx[6],"%02X",proto_PM100_CheckSum((u8 *)Tx,6));
|
||||
Tx[8] = PROTO_PM100_FRAME_STRUCT_CR;
|
||||
Len = 9;
|
||||
proto_PM100_Send((u8*)Tx,Len);
|
||||
}
|
||||
|
||||
/*<2A><><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>ת<EFBFBD><D7AA>*/
|
||||
static void proto_PM100_Tx_Set_Mode_Speed(u8 Dev,u8 Mode,u16 Speed)
|
||||
{
|
||||
char Tx[20];
|
||||
u16 Len;
|
||||
Tx[0] = PROTO_PM100_FRAME_STRUCT_STX;
|
||||
|
||||
sprintf(&Tx[1],"%s",PROTO_PM100_CMD_STR_SET_SPEED);
|
||||
|
||||
if(PROTO_PM100_DEV_MP == Dev)
|
||||
{
|
||||
Tx[4] = PROTO_PM100_DEV_CHAR_MP;
|
||||
}
|
||||
else if(PROTO_PM100_DEV_BP == Dev)
|
||||
{
|
||||
Tx[4] = PROTO_PM100_DEV_CHAR_BP;
|
||||
}
|
||||
else/*<2A>쳣*/
|
||||
{
|
||||
return ;
|
||||
}
|
||||
|
||||
|
||||
if(PROTO_PM100_MODE_NORMAL == Mode)
|
||||
{
|
||||
Tx[5] = PROTO_PM100_MODE_CHAR_NORMAL;
|
||||
}
|
||||
else if(PROTO_PM100_MODE_POWER_SAVING == Mode)
|
||||
{
|
||||
Tx[5] = PROTO_PM100_MODE_CHAR_POWER_SAVING;
|
||||
}
|
||||
else/*<2A>쳣*/
|
||||
{
|
||||
return ;
|
||||
}
|
||||
|
||||
if(Speed > 9900)
|
||||
{
|
||||
Speed = 99;
|
||||
}
|
||||
|
||||
sprintf(&Tx[6],"%d",Speed);
|
||||
|
||||
Tx[8] = PROTO_PM100_FRAME_STRUCT_ETX;
|
||||
sprintf(&Tx[9],"%02X",proto_PM100_CheckSum((u8 *)Tx,9));
|
||||
Tx[11] = PROTO_PM100_FRAME_STRUCT_CR;
|
||||
Len = 12;
|
||||
proto_PM100_Send((u8*)Tx,Len);
|
||||
}
|
||||
|
||||
|
||||
/*<2A><>ȡģ<C8A1><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
static void proto_PM100_Tx_Get_Data(u32 Analog_Code)
|
||||
{
|
||||
char Tx[20];
|
||||
u16 Len;
|
||||
u8 i,AD[8];
|
||||
Analog_Code = PROTO_PM100_GET_DATA_CODE;
|
||||
Tx[0] = PROTO_PM100_FRAME_STRUCT_STX;
|
||||
|
||||
sprintf(&Tx[1],"%s",PROTO_PM100_CMD_STR_GET_DATA);
|
||||
|
||||
for(i=0;i<8;i++)
|
||||
{
|
||||
AD[i] = (Analog_Code >> (4 * (7 - i))) & 0x0000000f;
|
||||
sprintf(&Tx[4 + i],"%X",AD[i]);
|
||||
}
|
||||
|
||||
Tx[12] = PROTO_PM100_FRAME_STRUCT_ETX;
|
||||
sprintf(&Tx[13],"%02X",proto_PM100_CheckSum((u8 *)Tx,13));
|
||||
Tx[15] = PROTO_PM100_FRAME_STRUCT_CR;
|
||||
Len = 16;
|
||||
proto_PM100_Send((u8*)Tx,Len);
|
||||
}
|
||||
|
||||
/*<2A><>ȡ״̬<D7B4>ͱ<EFBFBD><CDB1><EFBFBD>*/
|
||||
static void proto_PM100_Tx_Get_State_Alarm(void)
|
||||
{
|
||||
char Tx[20];
|
||||
u16 Len;
|
||||
Tx[0] = PROTO_PM100_FRAME_STRUCT_STX;
|
||||
|
||||
sprintf(&Tx[1],"%s",PROTO_PM100_CMD_STR_GET_STATE_ALARM);
|
||||
|
||||
Tx[4] = PROTO_PM100_FRAME_STRUCT_ETX;
|
||||
sprintf(&Tx[5],"%02X",proto_PM100_CheckSum((u8 *)Tx,5));
|
||||
Tx[7] = PROTO_PM100_FRAME_STRUCT_CR;
|
||||
Len = 8;
|
||||
proto_PM100_Send((u8*)Tx,Len);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static void proto_PM100_Tx_Task(void)
|
||||
{
|
||||
u8 SendTimeFlag = 0;
|
||||
|
||||
|
||||
if(0 == (pPM100->error_code & PROTO_PM100_ERROR_CODE_TIMEOUT))
|
||||
{
|
||||
pPM100->time_out_count++;
|
||||
if(pPM100->time_out_count > 10)
|
||||
{
|
||||
pPM100->error_code |= PROTO_PM100_ERROR_CODE_TIMEOUT;
|
||||
}
|
||||
}
|
||||
|
||||
if( 1 == pPM100->AnalogData_Control.FirstFlag
|
||||
&& 1 != pPM100->AnalogData_Control.EndFlag
|
||||
)
|
||||
{
|
||||
pPM100->AnalogData_Control.CountTime++;
|
||||
if(pPM100->AnalogData_Control.CountTime >= 3) /*<2A><><EFBFBD><EFBFBD>3<EFBFBD><33>û<EFBFBD><C3BB><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
{
|
||||
pPM100->AnalogData_Control.FirstFlag = 0;
|
||||
pPM100->AnalogData_Control.EndFlag = 0;
|
||||
pPM100->AnalogData_Control.CountTime = 0;
|
||||
pPM100->Sys_State = PROTO_PM100_CMD_GET_STATE_ALARM;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
switch(pPM100->Sys_State)
|
||||
{
|
||||
case PROTO_PM100_CMD_START :
|
||||
{
|
||||
proto_PM100_Tx_Start(pPM100->Set_Data.Dev);
|
||||
}break;
|
||||
case PROTO_PM100_CMD_STOP :
|
||||
{
|
||||
proto_PM100_Tx_Stop(pPM100->Set_Data.Dev);
|
||||
}break;
|
||||
case PROTO_PM100_CMD_RESET :
|
||||
{
|
||||
proto_PM100_Tx_Reset();
|
||||
}break;
|
||||
case PROTO_PM100_CMD_SET_MODE :
|
||||
{
|
||||
proto_PM100_Tx_Set_Mode(pPM100->Set_Data.Mode);
|
||||
}break;
|
||||
case PROTO_PM100_CMD_SET_SPEED :
|
||||
{
|
||||
proto_PM100_Tx_Set_Mode_Speed(pPM100->Set_Data.Dev,pPM100->Set_Data.Mode,pPM100->Set_Data.Speed);
|
||||
}break;
|
||||
case PROTO_PM100_CMD_GET_DATA :
|
||||
{
|
||||
proto_PM100_Tx_Get_Data(pPM100->Set_Data.Analog_Code);
|
||||
pPM100->AnalogData_Control.FirstFlag = 1;
|
||||
SendTimeFlag = 1;
|
||||
}break;
|
||||
case PROTO_PM100_CMD_GET_STATE_ALARM :
|
||||
{
|
||||
proto_PM100_Tx_Get_State_Alarm();
|
||||
SendTimeFlag = 1;
|
||||
}break;
|
||||
default:
|
||||
{
|
||||
|
||||
}break;
|
||||
}
|
||||
if(SendTimeFlag)
|
||||
{
|
||||
return ;
|
||||
}
|
||||
else
|
||||
{
|
||||
pPM100->SendTime++;
|
||||
if(pPM100->SendTime >= 3)
|
||||
{
|
||||
pPM100->SendTime = 0;
|
||||
pPM100->Sys_State = PROTO_PM100_CMD_GET_STATE_ALARM;
|
||||
}
|
||||
}
|
||||
}
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD>*/
|
||||
static void proto_PM100_Rx_Task(u8 *pData,u16 Len,void *other_data)
|
||||
{
|
||||
u8 SumCheck[2],SuccessFlag;
|
||||
u8 *pTextData;
|
||||
char TextData[10];
|
||||
|
||||
/*֡ͷ<D6A1>ж<EFBFBD>*/
|
||||
if(PROTO_PM100_FRAME_STRUCT_STX != pData[0])
|
||||
{
|
||||
return;
|
||||
}
|
||||
/*֡β<D6A1>ж<EFBFBD>*/
|
||||
if( PROTO_PM100_FRAME_STRUCT_ETX != pData[Len-4]
|
||||
|| PROTO_PM100_FRAME_STRUCT_CR != pData[Len-1]
|
||||
)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if(PROTO_PM100_CMD_GET_DATA == pPM100->Sys_State)/*ʵʱģ<CAB1><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD>жϣ<D0B6><CFA3>Ѿ<EFBFBD>ճ<EFBFBD><D5B3><EFBFBD><EFBFBD>*/
|
||||
{
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
/*У<><D0A3><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>*/
|
||||
sprintf((char*)SumCheck,"%02X",proto_PM100_CheckSum(pData,Len - 3));
|
||||
|
||||
if(SumCheck[0] != pData[Len - 3] || SumCheck[1] != pData[Len - 2])
|
||||
{
|
||||
return ;
|
||||
}
|
||||
}
|
||||
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>*/
|
||||
pPM100->error_code &= (~PROTO_PM100_ERROR_CODE_TIMEOUT);
|
||||
pPM100->time_out_count = 0;
|
||||
|
||||
SuccessFlag = 0;
|
||||
pTextData = &pData[1];
|
||||
switch(pPM100->Sys_State)
|
||||
{
|
||||
case PROTO_PM100_CMD_START :
|
||||
case PROTO_PM100_CMD_STOP :
|
||||
case PROTO_PM100_CMD_RESET :
|
||||
case PROTO_PM100_CMD_SET_MODE :
|
||||
case PROTO_PM100_CMD_SET_SPEED :
|
||||
{
|
||||
if(0 == strncmp((char *)pTextData,PROTO_PM100_CMD_STR_SET_OK,strlen(PROTO_PM100_CMD_STR_SET_OK)))
|
||||
{
|
||||
SuccessFlag = 1;
|
||||
proto_PM100_SysState_Switch();
|
||||
}
|
||||
else
|
||||
{
|
||||
SuccessFlag = 0;
|
||||
}
|
||||
}break;
|
||||
case PROTO_PM100_CMD_GET_DATA :
|
||||
{
|
||||
u16 Len_Index = 0;
|
||||
u8 *pData_u8 = pData;
|
||||
int DataIndex;
|
||||
float Data;
|
||||
float *pData_float = (float *)&pPM100->AnalogData;
|
||||
|
||||
|
||||
while(Len_Index < Len)
|
||||
{
|
||||
|
||||
pData_u8 = &pData[Len_Index + 1];
|
||||
snprintf(TextData,3,"%s",pData_u8);
|
||||
sscanf((char*)TextData,"%d",&DataIndex);
|
||||
if(DataIndex > 22)
|
||||
{
|
||||
Len_Index += 14;
|
||||
continue ;
|
||||
}
|
||||
snprintf(TextData,8,"%s",&pData_u8[3]);
|
||||
sscanf((char*)TextData,"%f",&Data);
|
||||
pData_float[DataIndex] = Data;
|
||||
Len_Index += 14;
|
||||
}
|
||||
Len_Index -=14;
|
||||
pData_u8 = &pData[Len_Index + 1];
|
||||
if(0 == strncmp((char *)pData_u8,PROTO_PM100_CMD_STR_SET_END,strlen(PROTO_PM100_CMD_STR_SET_END)))
|
||||
{
|
||||
SuccessFlag = 1;
|
||||
pPM100->AnalogData_Control.EndFlag = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
SuccessFlag = 0;
|
||||
}
|
||||
/*
|
||||
if(Len > 8)
|
||||
{
|
||||
int DataIndex;
|
||||
float Data;
|
||||
float *pData = (float *)&pPM100->AnalogData;
|
||||
snprintf(TextData,3,"%s",pTextData);
|
||||
sscanf((char*)TextData,"%d",&DataIndex);
|
||||
if(DataIndex >= 32)
|
||||
{
|
||||
return ;
|
||||
}
|
||||
|
||||
snprintf(TextData,8,"%s",&pTextData[3]);
|
||||
sscanf((char*)TextData,"%f",&Data);
|
||||
pData[DataIndex] = Data;
|
||||
SuccessFlag = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(0 == strncmp((char *)pTextData,PROTO_PM100_CMD_STR_SET_END,strlen(PROTO_PM100_CMD_STR_SET_END)))
|
||||
{
|
||||
SuccessFlag = 1;
|
||||
pPM100->AnalogData_Control.EndFlag = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
SuccessFlag = 0;
|
||||
}
|
||||
} */
|
||||
}break;
|
||||
case PROTO_PM100_CMD_GET_STATE_ALARM :
|
||||
{
|
||||
u32 Data,i;
|
||||
if(0 != strncmp((char *)pTextData,PROTO_PM100_CMD_STR_GET_STATE_ALARM,strlen(PROTO_PM100_CMD_STR_GET_STATE_ALARM)))
|
||||
{
|
||||
SuccessFlag = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if(PROTO_PM100_MODE_CHAR_NORMAL == pTextData[3])
|
||||
{
|
||||
pPM100->Opera_Status.Run_Status = PROTO_PM100_MODE_NORMAL;
|
||||
}
|
||||
else if(PROTO_PM100_MODE_CHAR_POWER_SAVING == pTextData[3])
|
||||
{
|
||||
pPM100->Opera_Status.Run_Status = PROTO_PM100_MODE_POWER_SAVING;
|
||||
}
|
||||
else/*<2A>쳣*/
|
||||
{
|
||||
SuccessFlag = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if(PROTO_PM100_MODE_CHAR_RUNING == pTextData[4])
|
||||
{
|
||||
pPM100->Opera_Status.MP_Status = PROTO_PM100_MODE_RUNING;
|
||||
}
|
||||
else if(PROTO_PM100_MODE_CHAR_STOP == pTextData[4])
|
||||
{
|
||||
pPM100->Opera_Status.MP_Status = PROTO_PM100_MODE_STOP;
|
||||
}
|
||||
else/*<2A>쳣*/
|
||||
{
|
||||
SuccessFlag = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if(PROTO_PM100_MODE_CHAR_RUNING == pTextData[5])
|
||||
{
|
||||
pPM100->Opera_Status.BP_Status = PROTO_PM100_MODE_RUNING;
|
||||
}
|
||||
else if(PROTO_PM100_MODE_CHAR_STOP == pTextData[5])
|
||||
{
|
||||
pPM100->Opera_Status.BP_Status = PROTO_PM100_MODE_STOP;
|
||||
}
|
||||
else/*<2A>쳣*/
|
||||
{
|
||||
SuccessFlag = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
pPM100->Opera_Status.Warming_Code = 0;
|
||||
pPM100->Opera_Status.Alarm_Code = 0;
|
||||
// for(i=0;i<8;i++)
|
||||
// {
|
||||
// snprintf(TextData,8,"%s",&pTextData[6]);
|
||||
// sscanf((char*)TextData,"%x",&Data);
|
||||
// pPM100->Opera_Status.Warming_Code |= (Data & 0x0000000f);
|
||||
//
|
||||
// snprintf(TextData,8,"%s",&pTextData[14]);
|
||||
// sscanf((char*)TextData,"%x",&Data);
|
||||
// pPM100->Opera_Status.Alarm_Code |= Data & 0x0000000f;
|
||||
// }
|
||||
sscanf((const char *)&pTextData[6], "%8x", &pPM100->Opera_Status.Warming_Code);
|
||||
sscanf((const char *)&pTextData[14], "%8x", &pPM100->Opera_Status.Alarm_Code);
|
||||
|
||||
if(0 == proto_PM100_SysState_Switch())
|
||||
{
|
||||
pPM100->Sys_State = PROTO_PM100_CMD_GET_DATA; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3>ͻ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>*/
|
||||
}
|
||||
|
||||
SuccessFlag = 1;
|
||||
}break;
|
||||
default:
|
||||
{
|
||||
|
||||
}break;
|
||||
}
|
||||
/*ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD><EFBFBD>Ƿְ<C7B7><D6B0><EFBFBD>ȡ<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2B4A6>*/
|
||||
if(PROTO_PM100_CMD_GET_DATA == pPM100->Sys_State)
|
||||
{
|
||||
if(1 == pPM100->AnalogData_Control.FirstFlag)
|
||||
{
|
||||
/*<2A>ְ<EFBFBD><D6B0><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
if(1 == pPM100->AnalogData_Control.EndFlag)
|
||||
{
|
||||
pPM100->AnalogData_Control.FirstFlag = 0;
|
||||
pPM100->AnalogData_Control.EndFlag = 0;
|
||||
pPM100->AnalogData_Control.CountTime = 0;
|
||||
proto_PM100_SysState_Switch();
|
||||
}
|
||||
else if(0 == SuccessFlag)
|
||||
{
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
pPM100->AnalogData_Control.CountTime = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(0 == SuccessFlag)
|
||||
{
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
pPM100->SendTime = 0;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
189
usr/protocol/proto_PM100.h
Normal file
189
usr/protocol/proto_PM100.h
Normal file
@@ -0,0 +1,189 @@
|
||||
#ifndef _PROTO_PM100_H_
|
||||
#define _PROTO_PM100_H_
|
||||
|
||||
#include "main.h"
|
||||
#include "algo_queue.h"
|
||||
|
||||
|
||||
|
||||
/*<2A><><EFBFBD><EFBFBD>֡<EFBFBD><D6A1>ʽ STX TEXT ETX SUM CR*/
|
||||
#define PROTO_PM100_FRAME_STRUCT_STX (0x02)
|
||||
|
||||
#define PROTO_PM100_FRAME_STRUCT_ETX (0x03)
|
||||
|
||||
#define PROTO_PM100_FRAME_STRUCT_CR (0x0D)
|
||||
|
||||
|
||||
/*<2A>豸*/
|
||||
#define PROTO_PM100_DEV_MP 0 /*<2A><><EFBFBD><EFBFBD>*/
|
||||
#define PROTO_PM100_DEV_BP 1 /*<2A><><EFBFBD>ӱ<EFBFBD>*/
|
||||
|
||||
#define PROTO_PM100_MODE_NORMAL 0 /*NORMAL <20><><EFBFBD><EFBFBD>*/
|
||||
#define PROTO_PM100_MODE_POWER_SAVING 1 /*POWER-SAVING <20><><EFBFBD><EFBFBD>*/
|
||||
|
||||
#define PROTO_PM100_MODE_RUN 0 /*<2A>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD>*/
|
||||
#define PROTO_PM100_MODE_ALARM 1 /*<2A>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD>*/
|
||||
#define PROTO_PM100_MODE_PE 2
|
||||
#define PROTO_PM100_MODE_IDIE 3 /*<2A>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD>/ֹͣ*/
|
||||
#define PROTO_PM100_MODE_OFFLINE 4 /*<2A>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD>*/
|
||||
#define PROTO_PM100_MODE_ONLINE 5 /*<2A>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD>*/
|
||||
|
||||
#define PROTO_PM100_MODE_RUNING 0 /*<2A><><EFBFBD><EFBFBD>*/
|
||||
#define PROTO_PM100_MODE_STOP 1 /*ֹͣ*/
|
||||
|
||||
#define PROTO_PM100_DEV_CHAR_MP ('M') /*<2A><><EFBFBD><EFBFBD>*/
|
||||
#define PROTO_PM100_DEV_CHAR_BP ('B') /*<2A><><EFBFBD>ӱ<EFBFBD>*/
|
||||
|
||||
#define PROTO_PM100_MODE_CHAR_NORMAL ('N') /*NORMAL <20><><EFBFBD><EFBFBD>*/
|
||||
#define PROTO_PM100_MODE_CHAR_POWER_SAVING ('S') /*POWER-SAVING <20><><EFBFBD><EFBFBD>*/
|
||||
|
||||
#define PROTO_PM100_MODE_CHAR_RUNING ('R') /*<2A><><EFBFBD><EFBFBD>*/
|
||||
#define PROTO_PM100_MODE_CHAR_STOP ('S') /*ֹͣ*/
|
||||
|
||||
/*ָ<><D6B8>*/
|
||||
/*<2A>ַ<EFBFBD><D6B7><EFBFBD>*/
|
||||
#define PROTO_PM100_CMD_STR_START ("S20") /*<2A><><EFBFBD><EFBFBD>*/
|
||||
#define PROTO_PM100_CMD_STR_STOP ("S21") /*ֹͣ*/
|
||||
#define PROTO_PM100_CMD_STR_RESET ("S22") /*<2A><>λ*/
|
||||
#define PROTO_PM100_CMD_STR_SET_MODE ("S23") /*<2A><><EFBFBD>ñ<EFBFBD>ģʽ<C4A3><CABD>NORMAL/POWER-SAVING <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD>*/
|
||||
#define PROTO_PM100_CMD_STR_SET_SPEED ("S24") /*<2A><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>ģʽ<C4A3><CABD>NORMAL/POWER-SAVING <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD>*/
|
||||
#define PROTO_PM100_CMD_STR_GET_DATA ("M20") /*<2A><>ȡ<EFBFBD>û<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>*/
|
||||
#define PROTO_PM100_CMD_STR_GET_STATE_ALARM ("M21") /*<2A><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>״̬<D7B4>뱨<EFBFBD><EBB1A8>*/
|
||||
|
||||
#define PROTO_PM100_CMD_STR_SET_OK ("OK") /*<2A><><EFBFBD>óɹ<C3B3>*/
|
||||
#define PROTO_PM100_CMD_STR_SET_NG ("NG") /*<2A><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>*/
|
||||
#define PROTO_PM100_CMD_STR_SET_END ("END") /*<2A><><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD>*/
|
||||
|
||||
/*CMD*/
|
||||
#define PROTO_PM100_CMD_START 0 /*<2A><><EFBFBD><EFBFBD>*/
|
||||
#define PROTO_PM100_CMD_STOP 2 /*ֹͣ*/
|
||||
#define PROTO_PM100_CMD_RESET 3 /*<2A><>λ*/
|
||||
#define PROTO_PM100_CMD_SET_MODE 4 /*<2A><><EFBFBD>ñ<EFBFBD>ģʽ<C4A3><CABD>NORMAL/POWER-SAVING <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD>*/
|
||||
#define PROTO_PM100_CMD_SET_SPEED 5 /*<2A><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>ģʽ<C4A3><CABD>NORMAL/POWER-SAVING <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD>*/
|
||||
#define PROTO_PM100_CMD_GET_DATA 6 /*<2A><>ȡ<EFBFBD>û<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>*/
|
||||
#define PROTO_PM100_CMD_GET_STATE_ALARM 7 /*<2A><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>״̬<D7B4>뱨<EFBFBD><EBB1A8>*/
|
||||
|
||||
#define BP_ON ("BPON") /*bp<62><70><EFBFBD><EFBFBD>*/
|
||||
#define MP_ON ("MPON") /*mp<6D><70><EFBFBD><EFBFBD>*/
|
||||
#define ALL_RESET ("ALLRESET") /*<2A><><EFBFBD><EFBFBD>*/
|
||||
#define BP_STOP ("BPSTOP") /*bpֹͣ*/
|
||||
#define MP_STOP ("MPSTOP") /*mpֹͣ*/
|
||||
#define NORMAL ("N") /*<2A><><EFBFBD><EFBFBD>ģʽ*/
|
||||
#define POWER_SAVE ("S") /*<2A><><EFBFBD><EFBFBD>ģʽ*/
|
||||
#define MP_NORMAL_SPEED ("MN") /*mp<6D><70><EFBFBD><EFBFBD>ģʽת<CABD><D7AA>*/
|
||||
#define MP_SAVE_SPEED ("MS") /*mp<6D><70><EFBFBD><EFBFBD>ģʽת<CABD><D7AA>*/
|
||||
#define BP_NORMAL_SPEED ("BN") /*bp<62><70><EFBFBD><EFBFBD>ģʽת<CABD><D7AA>*/
|
||||
#define BP_SAVE_SPEED ("BS") /*bp<62><70><EFBFBD><EFBFBD>ģʽת<CABD><D7AA>*/
|
||||
|
||||
#define PROTO_PM100_GET_DATA_CODE (0x007FD9FF)/*<2A><>ȡ<EFBFBD><C8A1>Щʵ<D0A9><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
|
||||
|
||||
#define PROTO_PM100_ERROR_CODE_TIMEOUT (0x0001)/*ͨѶ<CDA8><D1B6>ʱ*/
|
||||
|
||||
/*PM100ģ<30><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
typedef struct
|
||||
{
|
||||
float Total_running_time; /*H*/
|
||||
float BP_power ; /*KW*/
|
||||
float MP_power ; /*KW*/
|
||||
float BP_motor_speed ; /*K/min*/
|
||||
float MP_motor_speed ; /*K/min*/
|
||||
float BP_current ; /*A*/
|
||||
float MP_current ; /*A*/
|
||||
float BP_casing_temp ; /*<2A><>*/
|
||||
float MP_casing_temp ; /*<2A><>*/
|
||||
float Reserved_1[2] ; /* */
|
||||
float Cooling_water_flow; /*L/min*/
|
||||
float Pump_N2_flow ; /*Pam3/s*/
|
||||
float Reserved ; /* */
|
||||
float Back_pressure_1 ; /*KPa*/
|
||||
float Heater1 ; /*<2A><>*/
|
||||
float Heater2 ; /*<2A><>*/
|
||||
float Heater3 ; /*<2A><>*/
|
||||
float Heater4 ; /*<2A><>*/
|
||||
float Vacuum_pressure ; /*KPa*/
|
||||
float Cooler_1 ; /*<2A><>*/
|
||||
float Cooler_2 ; /*<2A><>*/
|
||||
float Cooler_3 ; /*<2A><>*/
|
||||
float Reserved_2[9] ; /*H*/
|
||||
}proto_PM100_AnalogData_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u8 Sys_State;
|
||||
u8 Dev;
|
||||
u8 Mode;
|
||||
u16 Speed;
|
||||
u32 Analog_Code; /*<2A><>ȡ<EFBFBD><C8A1>Щģ<D0A9><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
}proto_PM100_Set_Data_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u8 Run_Status;
|
||||
u8 MP_Status;
|
||||
u8 BP_Status;
|
||||
u32 Warming_Code; /*<2A>豸״̬<D7B4><CCAC>*/
|
||||
u32 Alarm_Code; /*<2A><><EFBFBD><EFBFBD>״̬<D7B4><CCAC>*/
|
||||
char alarm_start_str[32][15]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼʱ<CABC><CAB1><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD> YYYYMMDDHHMMSS
|
||||
char warning_start_str[32][15]; // <20><><EFBFBD>濪ʼʱ<CABC><CAB1><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
|
||||
u32 alarm_start_sec[32]; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2000-01-01<30><31>
|
||||
u32 warning_start_sec[32]; // <20><><EFBFBD>濪ʼ<E6BFAA><CABC><EFBFBD><EFBFBD>
|
||||
}proto_Opera_Status_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
queue Sys_StateQueue; /*״̬<D7B4><CCAC><EFBFBD><EFBFBD>*/
|
||||
u8 Sys_State; /*Э<><D0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬*/
|
||||
u8 SendTime; /*ָ<><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD>*/
|
||||
proto_PM100_AnalogData_t AnalogData;
|
||||
|
||||
u16 time_out_count; /*<2A><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>*/
|
||||
u32 error_code; /*<2A>豸״̬*/
|
||||
|
||||
struct
|
||||
{
|
||||
u8 FirstFlag;
|
||||
u8 EndFlag;
|
||||
u16 CountTime;
|
||||
}AnalogData_Control; /*<2A><>ȡģ<C8A1><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>صĿ<D8B5><C4BF>Ʋ<EFBFBD><C6B2><EFBFBD>*/
|
||||
|
||||
struct
|
||||
{
|
||||
u64 Code_Last; /*<2A><>һ<EFBFBD>εı<CEB5><C4B1><EFBFBD>ֵ*/
|
||||
|
||||
u16 StartTime; /*<2A><>ʱ*/
|
||||
void (*Reset)(void); /*<2A><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD>*/
|
||||
}Alarm_Control; /*<2A><><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
|
||||
proto_PM100_Set_Data_t Set_Data; /*<2A><><EFBFBD>õIJ<C3B5><C4B2><EFBFBD>*/
|
||||
|
||||
proto_Opera_Status_t Opera_Status;
|
||||
|
||||
struct
|
||||
{
|
||||
proto_Opera_Status_t Opera_Status_Last; /*<2A><>һ<EFBFBD>ε<EFBFBD><CEB5>豸״̬*/
|
||||
|
||||
u16 StartTime; /*<2A><>ʱ*/
|
||||
void (*Reset)(void); /*<2A><><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD>*/
|
||||
}Dev_Status_Control; /*<2A>豸״̬<D7B4><CCAC><EFBFBD><EFBFBD>*/
|
||||
|
||||
struct
|
||||
{
|
||||
void (*Start)(u8); /*<2A><><EFBFBD><EFBFBD>*/
|
||||
void (*Stop)(u8); /*ֹͣ*/
|
||||
void (*Reset)(void); /*<2A><>λ*/
|
||||
void (*Set_Mode)(u8); /*<2A><><EFBFBD>ñ<EFBFBD>ģʽ<C4A3><CABD>NORMAL/POWER-SAVING <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD>*/
|
||||
void (*Set_Speed)(u8,u8,u16); /*<2A><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>ģʽ<C4A3><CABD>NORMAL/POWER-SAVING <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD>*/
|
||||
}Control;
|
||||
|
||||
void (*Init)(void);
|
||||
void (*Rx_Task)(u8 *,u16,void *);
|
||||
void (*Tx_Task)(void);
|
||||
}proto_PM100_t;
|
||||
|
||||
|
||||
extern proto_PM100_t PM100;
|
||||
extern char *proto_PM100_Str_WarmingCode[32];
|
||||
extern char *proto_PM100_Str_AlarmCode[32];
|
||||
|
||||
#endif
|
||||
745
usr/protocol/proto_Para_Modbus.c
Normal file
745
usr/protocol/proto_Para_Modbus.c
Normal file
@@ -0,0 +1,745 @@
|
||||
#include "proto_Para_Modbus.h"
|
||||
#include "string.h"
|
||||
#include "bsp_Uart.h"
|
||||
#include "os_timer.h"
|
||||
|
||||
#include "stdio.h"
|
||||
|
||||
#include "app.h"
|
||||
#include "bsp_W5500.h"
|
||||
#include "proto_HSMS.h"
|
||||
#include "bsp_Flash.h"
|
||||
#include "bsp_Wdg.h"
|
||||
|
||||
|
||||
static ModbusAnalysisData_t ModbusAnalysisData;//ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ṹ<EFBFBD><E1B9B9>
|
||||
static ModbusCommunicationSendBuf_t SendStruct;//<2F><><EFBFBD>ͽṹ<CDBD><E1B9B9>
|
||||
|
||||
static void ModbusCommunicationDataReceive(u8 *pData, u16 len,void *other_data);
|
||||
static void ModbusCommunicationDataSend(u8 *pData, u16 len);
|
||||
static void proto_Modbus_Init(void);
|
||||
static void proto_Modbus_Task(void);
|
||||
static ModbusErrorCode_e ModbusCommunicationDataWrite(u16 Addr, u16 Value);
|
||||
static u16 ModbusCommunicationDataRead(u16 Addr);
|
||||
|
||||
proto_Modbus_t Para_Modbus=
|
||||
{
|
||||
.ID = 0x01,
|
||||
.DataRead = ModbusCommunicationDataRead,
|
||||
.DataWrite = ModbusCommunicationDataWrite,
|
||||
.DataAnalysis = ModbusCommunicationDataReceive,
|
||||
.Init = proto_Modbus_Init,
|
||||
.Task = proto_Modbus_Task,
|
||||
};
|
||||
|
||||
static proto_Modbus_t *pModbus = &Para_Modbus;
|
||||
static bsp_Uart_t *rx_uart = NULL;
|
||||
|
||||
static void ModbusCommunicationDataSend(u8 *pData, u16 Len)
|
||||
{
|
||||
if(&COM_Uart1 == rx_uart)
|
||||
{
|
||||
COM_Uart1.Send(&COM_Uart1,pData,Len);
|
||||
}
|
||||
else if(&COM_Uart2 == rx_uart)
|
||||
{
|
||||
COM_Uart2.Send(&COM_Uart2,pData,Len);
|
||||
}
|
||||
}
|
||||
|
||||
static void proto_Modbus_Init(void)
|
||||
{
|
||||
COM_Uart1.Rx_DataAnalysis = ModbusCommunicationDataReceive;
|
||||
COM_Uart2.Rx_DataAnalysis = ModbusCommunicationDataReceive;
|
||||
}
|
||||
static void proto_Modbus_Task(void)
|
||||
{
|
||||
|
||||
}
|
||||
static void ModbusCommunicationDataReceive(u8 *pData, u16 len,void *other_data)
|
||||
{
|
||||
ModbusErrorCode_e ErrorCode;
|
||||
u8 inx;
|
||||
u16 TempAddr, TempData, Crc16;
|
||||
|
||||
if (0 == ModbusAnalysis(&ModbusAnalysisData, pData, len))//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD> У<><D0A3><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ȷ
|
||||
return;
|
||||
if (pModbus->ID != ModbusAnalysisData.ID)//<2F>ж<EFBFBD>ID<49>Ƿ<EFBFBD><C7B7><EFBFBD>ȷ
|
||||
return;
|
||||
|
||||
ErrorCode = ModbusErrorCode_Success;
|
||||
rx_uart = (bsp_Uart_t *)other_data;
|
||||
|
||||
/* //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>Ƿ<C7B7><F1B3ACB3><EFBFBD>Χ
|
||||
if ((ModbusAnalysisData.StartAddress >= MODBUS_REG_LEN) || (ModbusAnalysisData.RegNumber >= MODBUS_REG_LEN) ||
|
||||
(ModbusAnalysisData.StartAddress + ModbusAnalysisData.RegNumber >= MODBUS_REG_LEN))
|
||||
{
|
||||
ErrorCode = ModbusErrorCode_IllegalAddr;
|
||||
goto Error;
|
||||
}
|
||||
*/
|
||||
|
||||
switch (ModbusAnalysisData.Func)
|
||||
{
|
||||
case 0x03:
|
||||
case 0x04:
|
||||
{
|
||||
TempAddr = ModbusAnalysisData.StartAddress;
|
||||
SendStruct.SendBuffer[0] = ModbusAnalysisData.ID;
|
||||
SendStruct.SendBuffer[1] = ModbusAnalysisData.Func;
|
||||
SendStruct.SendBuffer[2] = 2 * ModbusAnalysisData.RegNumber;
|
||||
for (inx = 0; inx < ModbusAnalysisData.RegNumber; inx++)
|
||||
{
|
||||
TempData = ModbusCommunicationDataRead(TempAddr);
|
||||
SendStruct.SendBuffer[3 + 2 * inx] = (TempData >> 8) & 0xff;
|
||||
SendStruct.SendBuffer[4 + 2 * inx] = TempData & 0xff;
|
||||
TempAddr++;
|
||||
}
|
||||
Crc16 = ModbusCrc16(SendStruct.SendBuffer, 3 + SendStruct.SendBuffer[2]);
|
||||
SendStruct.SendBuffer[3 + SendStruct.SendBuffer[2]] = Crc16 & 0xff;
|
||||
SendStruct.SendBuffer[4 + SendStruct.SendBuffer[2]] = (Crc16 >> 8) & 0xff;
|
||||
SendStruct.Len = 5 + SendStruct.SendBuffer[2];
|
||||
}goto Success;
|
||||
/*<2A><><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>*/
|
||||
case 0x41:
|
||||
{
|
||||
TempAddr = ModbusAnalysisData.StartAddress;
|
||||
SendStruct.SendBuffer[0] = ModbusAnalysisData.ID;
|
||||
SendStruct.SendBuffer[1] = ModbusAnalysisData.Func;
|
||||
SendStruct.SendBuffer[2] = ModbusAnalysisData.StartAddress >> 8;
|
||||
SendStruct.SendBuffer[3] = ModbusAnalysisData.StartAddress & 0xff;
|
||||
SendStruct.SendBuffer[4] = (2 * ModbusAnalysisData.RegNumber) >> 8;
|
||||
SendStruct.SendBuffer[5] = (2 * ModbusAnalysisData.RegNumber) & 0xff;
|
||||
for (inx = 0; inx < ModbusAnalysisData.RegNumber; inx++)
|
||||
{
|
||||
TempData = ModbusCommunicationDataRead(TempAddr);
|
||||
SendStruct.SendBuffer[6 + 2 * inx] = (TempData >> 8) & 0xff;
|
||||
SendStruct.SendBuffer[7 + 2 * inx] = TempData & 0xff;
|
||||
TempAddr++;
|
||||
}
|
||||
Crc16 = ModbusCrc16(SendStruct.SendBuffer, 6 + 2 * ModbusAnalysisData.RegNumber);
|
||||
SendStruct.SendBuffer[6 + 2 * ModbusAnalysisData.RegNumber] = Crc16 & 0xff;
|
||||
SendStruct.SendBuffer[7 + 2 * ModbusAnalysisData.RegNumber] = (Crc16 >> 8) & 0xff;
|
||||
SendStruct.Len = 8 + 2 * ModbusAnalysisData.RegNumber;
|
||||
}goto Success;
|
||||
|
||||
case 0x06:
|
||||
{
|
||||
TempAddr = ModbusAnalysisData.StartAddress;
|
||||
TempData = (ModbusAnalysisData.wDataAddress[0] << 8) | ModbusAnalysisData.wDataAddress[1];
|
||||
ErrorCode = ModbusCommunicationDataWrite(TempAddr, TempData);
|
||||
if (ErrorCode)
|
||||
{
|
||||
goto Error;
|
||||
}
|
||||
|
||||
SendStruct.Len = 8;
|
||||
SendStruct.SendBuffer[0] = ModbusAnalysisData.ID;
|
||||
SendStruct.SendBuffer[1] = ModbusAnalysisData.Func;
|
||||
SendStruct.SendBuffer[2] = ModbusAnalysisData.StartAddress >> 8;
|
||||
SendStruct.SendBuffer[3] = ModbusAnalysisData.StartAddress & 0xff;
|
||||
SendStruct.SendBuffer[4] = ModbusAnalysisData.wDataAddress[0];
|
||||
SendStruct.SendBuffer[5] = ModbusAnalysisData.wDataAddress[1];
|
||||
Crc16 = ModbusCrc16(SendStruct.SendBuffer, 6);
|
||||
SendStruct.SendBuffer[6] = Crc16 & 0xff;
|
||||
SendStruct.SendBuffer[7] = (Crc16 >> 8) & 0xff;
|
||||
}break;
|
||||
|
||||
case 0x10:
|
||||
{
|
||||
TempAddr = ModbusAnalysisData.StartAddress;
|
||||
for (inx = 0; inx < ModbusAnalysisData.RegNumber; inx++)
|
||||
{
|
||||
TempData = ModbusAnalysisData.wDataAddress[2 * inx];
|
||||
TempData = (TempData << 8) | ModbusAnalysisData.wDataAddress[2 * inx + 1];
|
||||
ErrorCode = ModbusCommunicationDataWrite(TempAddr, TempData);
|
||||
TempAddr++;
|
||||
if (ErrorCode)
|
||||
{
|
||||
goto Error;
|
||||
}
|
||||
}
|
||||
SendStruct.Len = 8;
|
||||
SendStruct.SendBuffer[0] = ModbusAnalysisData.ID;
|
||||
SendStruct.SendBuffer[1] = ModbusAnalysisData.Func;
|
||||
SendStruct.SendBuffer[2] = ModbusAnalysisData.StartAddress >> 8;
|
||||
SendStruct.SendBuffer[3] = ModbusAnalysisData.StartAddress & 0xff;
|
||||
SendStruct.SendBuffer[4] = ModbusAnalysisData.RegNumber >> 8;
|
||||
SendStruct.SendBuffer[5] = ModbusAnalysisData.RegNumber & 0xff;
|
||||
Crc16 = ModbusCrc16(SendStruct.SendBuffer, 6);
|
||||
SendStruct.SendBuffer[6] = Crc16 & 0xff;
|
||||
SendStruct.SendBuffer[7] = (Crc16 >> 8) & 0xff;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
{
|
||||
ErrorCode = ModbusErrorCode_IllegalFunction;
|
||||
}
|
||||
goto Error;
|
||||
}
|
||||
|
||||
Success:
|
||||
ModbusCommunicationDataSend(SendStruct.SendBuffer, SendStruct.Len);
|
||||
return;
|
||||
|
||||
Error:
|
||||
SendStruct.Len = 5;
|
||||
SendStruct.SendBuffer[0] = ModbusAnalysisData.ID;
|
||||
SendStruct.SendBuffer[1] = ModbusAnalysisData.Func | 0x80;
|
||||
SendStruct.SendBuffer[2] = ErrorCode;
|
||||
Crc16 = ModbusCrc16(SendStruct.SendBuffer, 3);
|
||||
SendStruct.SendBuffer[3] = Crc16 & 0xff;
|
||||
SendStruct.SendBuffer[4] = (Crc16 >> 8) & 0xff;
|
||||
ModbusCommunicationDataSend(SendStruct.SendBuffer, SendStruct.Len);
|
||||
}
|
||||
|
||||
/*modbus<75><73><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>u16ת<36><D7AA>Ϊascii<69><69>u16 ʵ<><CAB5>Ϊ<EFBFBD>Ե<EFBFBD><D4B5>ߵ<EFBFBD><DFB5>ֽ<EFBFBD>*/
|
||||
static u16 modbus_u16_to_ascii_u16(u16 modbus_u16)
|
||||
{
|
||||
return (modbus_u16 << 8) | (modbus_u16 >> 8);
|
||||
}
|
||||
|
||||
/*ascii<69><69>u16 ת<><D7AA>Ϊmodbus u16<31><36><EFBFBD><EFBFBD> ʵ<><CAB5>Ϊ<EFBFBD>Ե<EFBFBD><D4B5>ߵ<EFBFBD><DFB5>ֽ<EFBFBD>*/
|
||||
static u16 ascii_u16_to_modbus_u16(u16 modbus_u16)
|
||||
{
|
||||
return (modbus_u16 << 8) | (modbus_u16 >> 8);
|
||||
}
|
||||
|
||||
/******************************************
|
||||
* <20><><EFBFBD><EFBFBD>: ModbusCommunicationDataWrite
|
||||
* <20><><EFBFBD><EFBFBD>: Modbusд<73>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD>: Addr: <20><>ַ
|
||||
Value:<3A><><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD>: <20><>
|
||||
* <20><><EFBFBD><EFBFBD>: <20><>
|
||||
******************************************/
|
||||
static ModbusErrorCode_e ModbusCommunicationDataWrite(u16 Addr, u16 Value)
|
||||
{
|
||||
ModbusErrorCode_e ErrorCode;
|
||||
ErrorCode = ModbusErrorCode_Success;
|
||||
|
||||
switch(Addr)
|
||||
{
|
||||
/*SN*/
|
||||
case 12 ... 16:
|
||||
{
|
||||
Usr_Flash.FlashData.SN[Addr - 12] = Value;
|
||||
Usr_Flash.Write();
|
||||
}break;
|
||||
/*IP<49><50>ַ*/
|
||||
case 17 ... 20:
|
||||
{
|
||||
W5500.IP_Addr[Addr - 17] = Value;
|
||||
Usr_Flash.FlashData.IP_Addr[Addr - 17] = Value;
|
||||
}break;
|
||||
/*<2A>˿ں<CBBF>*/
|
||||
case 21:
|
||||
{
|
||||
W5500.W5500_Class[0].ConfigData.Port[0] = Value >> 8;
|
||||
W5500.W5500_Class[0].ConfigData.Port[1] = Value & 0x00ff;
|
||||
Usr_Flash.FlashData.Port[0] = Value >> 8;
|
||||
Usr_Flash.FlashData.Port[1] = Value & 0x00ff;
|
||||
}break;
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
case 22 ... 25:
|
||||
{
|
||||
W5500.Sub_Mask[Addr - 22] = Value;
|
||||
Usr_Flash.FlashData.Sub_Mask[Addr - 22] = Value;
|
||||
}break;
|
||||
case 26:
|
||||
{
|
||||
HSMS.Flash_ConfigData.Device_Id = Value;
|
||||
Usr_Flash.FlashData.Devic_Id = Value;
|
||||
Wdg.Feed();
|
||||
W5500.Init();
|
||||
Wdg.Feed();
|
||||
Usr_Flash.Write();
|
||||
}break;
|
||||
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
case 27 ... 30:
|
||||
{
|
||||
W5500.Gateway_IP[Addr - 27] = Value;
|
||||
Usr_Flash.FlashData.Gateway_IP[Addr - 27] = Value;
|
||||
W5500.Init();
|
||||
Usr_Flash.Write();
|
||||
} break;
|
||||
|
||||
/* <20>豸 SN */
|
||||
case 100 ... 107:
|
||||
{
|
||||
Usr_Flash.FlashData.Device_SN[Addr - 100] = modbus_u16_to_ascii_u16(Value);
|
||||
} break;
|
||||
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD><CCA8>λ<EFBFBD><CEBB> */
|
||||
case 108 ... 115:
|
||||
{
|
||||
Usr_Flash.FlashData.Device_Model[Addr - 108] = modbus_u16_to_ascii_u16(Value);
|
||||
} break;
|
||||
|
||||
/* <20>豸<EFBFBD>ͺ<EFBFBD> */
|
||||
case 116 ... 123:
|
||||
{
|
||||
Usr_Flash.FlashData.Device_ID[Addr - 116] = modbus_u16_to_ascii_u16(Value);
|
||||
} break;
|
||||
|
||||
/* <20><>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD>汾<EFBFBD><E6B1BE> */
|
||||
case 124 ... 131:
|
||||
{
|
||||
Usr_Flash.FlashData.Version[Addr - 124] = modbus_u16_to_ascii_u16(Value);
|
||||
} break;
|
||||
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
case 132 ... 139:
|
||||
{
|
||||
Usr_Flash.FlashData.Manufacturer[Addr - 132] = modbus_u16_to_ascii_u16(Value);
|
||||
} break;
|
||||
|
||||
/* <20><>̨<EFBFBD><CCA8><EFBFBD><EFBFBD> */
|
||||
case 140 ... 147:
|
||||
{
|
||||
Usr_Flash.FlashData.Station_Name[Addr - 140] = modbus_u16_to_ascii_u16(Value);
|
||||
} break;
|
||||
|
||||
/* ǻ<><C7BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
case 148 ... 155:
|
||||
{
|
||||
Usr_Flash.FlashData.Chamber_Name[Addr - 148] = modbus_u16_to_ascii_u16(Value);
|
||||
} break;
|
||||
|
||||
/* <20><>̨<EFBFBD><CCA8><EFBFBD><EFBFBD> */
|
||||
case 156 ... 163:
|
||||
{
|
||||
Usr_Flash.FlashData.Station_Type[Addr - 156] = modbus_u16_to_ascii_u16(Value);
|
||||
Usr_Flash.Write();
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Alarm_info */
|
||||
case 164 ... 183:
|
||||
{
|
||||
Usr_Flash.FlashData.Alarm_info[Addr - 164] = Value;
|
||||
Usr_Flash.Write();
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Data_ID1 */
|
||||
case 184:
|
||||
{
|
||||
Usr_Flash.FlashData.Data_ID1 = Value;
|
||||
Usr_Flash.Write();
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Collection_event_ID1 */
|
||||
case 185:
|
||||
{
|
||||
Usr_Flash.FlashData.Collection_event_ID1 = Value;
|
||||
Usr_Flash.Write();
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Report_ID1 */
|
||||
case 186:
|
||||
{
|
||||
Usr_Flash.FlashData.Report_ID1 = Value;
|
||||
Usr_Flash.Write();
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Alarm_ID */
|
||||
case 187:
|
||||
{
|
||||
Usr_Flash.FlashData.Alarm_ID = Value;
|
||||
Usr_Flash.Write();
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Alarm_Type */
|
||||
case 188 ... 194:
|
||||
{
|
||||
Usr_Flash.FlashData.Alarm_Type[Addr - 188] = Value;
|
||||
Usr_Flash.Write();
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Begin_Warning */
|
||||
case 195 ... 201:
|
||||
{
|
||||
Usr_Flash.FlashData.Begin_Warning[Addr - 195] = Value;
|
||||
Usr_Flash.Write();
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> IDS */
|
||||
case 202 ... 212:
|
||||
{
|
||||
Usr_Flash.FlashData.IDS[Addr - 202] = Value;
|
||||
Usr_Flash.Write();
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Over_Trigger */
|
||||
case 213 ... 221:
|
||||
{
|
||||
Usr_Flash.FlashData.Over_Trigger[Addr - 213] = Value;
|
||||
Usr_Flash.Write();
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Equipment */
|
||||
case 222 ... 226:
|
||||
{
|
||||
Usr_Flash.FlashData.Equipment[Addr - 222] = Value;
|
||||
Usr_Flash.Write();
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> E9 */
|
||||
case 227 ... 245:
|
||||
{
|
||||
Usr_Flash.FlashData.E9[Addr - 227] = Value;
|
||||
Usr_Flash.Write();
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Device_Type */
|
||||
case 246:
|
||||
{
|
||||
Usr_Flash.FlashData.Device_Type = Value;
|
||||
Usr_Flash.Write();
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Sensor */
|
||||
case 247:
|
||||
{
|
||||
Usr_Flash.FlashData.Sensor = Value;
|
||||
Usr_Flash.Write();
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Alarm_value */
|
||||
case 248:
|
||||
{
|
||||
Usr_Flash.FlashData.Alarm_value = Value;
|
||||
Usr_Flash.Write();
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Alarm_ubit */
|
||||
case 249:
|
||||
{
|
||||
Usr_Flash.FlashData.Alarm_ubit = Value;
|
||||
Usr_Flash.Write();
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Start_Time */
|
||||
case 250 ... 260:
|
||||
{
|
||||
Usr_Flash.FlashData.Start_Time[Addr - 250] = Value;
|
||||
Usr_Flash.Write();
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Alarm_Time */
|
||||
case 261 ... 266:
|
||||
{
|
||||
Usr_Flash.FlashData.Alarm_Time[Addr - 261] = Value;
|
||||
Usr_Flash.Write();
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Alarm */
|
||||
case 267 ... 272:
|
||||
{
|
||||
Usr_Flash.FlashData.Alarm[Addr - 267] = Value;
|
||||
Usr_Flash.Write();
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Data_ID2 */
|
||||
case 273:
|
||||
{
|
||||
Usr_Flash.FlashData.Data_ID2 = Value;
|
||||
Usr_Flash.Write();
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Collection_event_ID2 */
|
||||
case 274:
|
||||
{
|
||||
Usr_Flash.FlashData.Collection_event_ID2 = Value;
|
||||
Usr_Flash.Write();
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Report_ID2 */
|
||||
case 275:
|
||||
{
|
||||
Usr_Flash.FlashData.Report_ID2 = Value;
|
||||
Usr_Flash.Write();
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Sub_Device_Type */
|
||||
case 276 ... 277:
|
||||
{
|
||||
Usr_Flash.FlashData.Sub_Device_Type[Addr - 276] = Value;
|
||||
Usr_Flash.Write();
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Sub_Device_State */
|
||||
case 278 ... 279:
|
||||
{
|
||||
Usr_Flash.FlashData.Sub_Device_State[Addr - 278] = Value;
|
||||
Usr_Flash.Write();
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> State_Change_Time */
|
||||
case 280 ... 281:
|
||||
{
|
||||
Usr_Flash.FlashData.State_Change_Time[Addr - 280] = Value;
|
||||
Usr_Flash.Write();
|
||||
} break;
|
||||
}
|
||||
return ErrorCode;
|
||||
}
|
||||
|
||||
/******************************************
|
||||
* <20><><EFBFBD><EFBFBD>: ModbusCommunicationDataRead
|
||||
* <20><><EFBFBD><EFBFBD>: Modbus<75><73><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD>: Addr: <20><>ַ
|
||||
* <20><><EFBFBD><EFBFBD>: <20><>ַ<EFBFBD><D6B7>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* <20><><EFBFBD><EFBFBD>: <20><>
|
||||
******************************************/
|
||||
static u16 ModbusCommunicationDataRead(u16 Addr)
|
||||
{
|
||||
u8 *p_u8Data;
|
||||
u16 Data;
|
||||
u16 *pData;
|
||||
|
||||
switch(Addr)
|
||||
{
|
||||
/*SV*/
|
||||
case 0 ... 11:
|
||||
{
|
||||
p_u8Data = &SwVersion[Addr * 2];
|
||||
Data = p_u8Data[1] | p_u8Data[0] << 8;
|
||||
}break;
|
||||
/*SN*/
|
||||
case 12 ... 16:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.SN[Addr - 12];
|
||||
}break;
|
||||
/*IP<49><50>ַ*/
|
||||
case 17 ... 20:
|
||||
{
|
||||
Data = W5500.IP_Addr[Addr - 17];
|
||||
}break;
|
||||
/*<2A>˿ں<CBBF>*/
|
||||
case 21:
|
||||
{
|
||||
Data = W5500.W5500_Class[0].ConfigData.Port[0] << 8 | W5500.W5500_Class[0].ConfigData.Port[1];
|
||||
}break;
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
case 22 ... 25:
|
||||
{
|
||||
Data = W5500.Sub_Mask[Addr - 22];
|
||||
}break;
|
||||
/*SECS2Э<32><D0AD><EFBFBD>豸ID*/
|
||||
case 26:
|
||||
{
|
||||
Data = HSMS.Flash_ConfigData.Device_Id;
|
||||
}break;
|
||||
|
||||
/* <20><><EFBFBD><EFBFBD>*/
|
||||
case 27 ... 30:
|
||||
{
|
||||
Data = W5500.Gateway_IP[Addr - 27];
|
||||
} break;
|
||||
|
||||
/* <20>豸 SN */
|
||||
case 100 ... 107:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.Device_SN[Addr - 100];
|
||||
Data = ascii_u16_to_modbus_u16(Data);
|
||||
} break;
|
||||
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD><CCA8>λ<EFBFBD><CEBB> */
|
||||
case 108 ... 115:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.Device_Model[Addr - 108];
|
||||
Data = ascii_u16_to_modbus_u16(Data);
|
||||
} break;
|
||||
|
||||
/* <20>豸<EFBFBD>ͺ<EFBFBD> */
|
||||
case 116 ... 123:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.Device_ID[Addr - 116];
|
||||
Data = ascii_u16_to_modbus_u16(Data);
|
||||
} break;
|
||||
|
||||
/* <20><>̨<EFBFBD><CCA8><EFBFBD><EFBFBD><EFBFBD>汾<EFBFBD><E6B1BE> */
|
||||
case 124 ... 131:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.Version[Addr - 124];
|
||||
Data = ascii_u16_to_modbus_u16(Data);
|
||||
} break;
|
||||
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
case 132 ... 139:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.Manufacturer[Addr - 132];
|
||||
Data = ascii_u16_to_modbus_u16(Data);
|
||||
} break;
|
||||
|
||||
/* <20><>̨<EFBFBD><CCA8><EFBFBD><EFBFBD> */
|
||||
case 140 ... 147:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.Station_Name[Addr - 140];
|
||||
Data = ascii_u16_to_modbus_u16(Data);
|
||||
} break;
|
||||
|
||||
/* ǻ<><C7BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
case 148 ... 155:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.Chamber_Name[Addr - 148];
|
||||
Data = ascii_u16_to_modbus_u16(Data);
|
||||
} break;
|
||||
|
||||
/* <20><>̨<EFBFBD><CCA8><EFBFBD><EFBFBD> */
|
||||
case 156 ... 163:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.Station_Type[Addr - 156];
|
||||
Data = ascii_u16_to_modbus_u16(Data);
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Alarm_info */
|
||||
case 164 ... 183:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.Alarm_info[Addr - 164];
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Data_ID1 */
|
||||
case 184:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.Data_ID1;
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Collection_event_ID1 */
|
||||
case 185:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.Collection_event_ID1;
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Report_ID1 */
|
||||
case 186:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.Report_ID1;
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Alarm_ID */
|
||||
case 187:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.Alarm_ID;
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Alarm_Type */
|
||||
case 188 ... 194:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.Alarm_Type[Addr - 188];
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Begin_Warning */
|
||||
case 195 ... 201:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.Begin_Warning[Addr - 195];
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> IDS */
|
||||
case 202 ... 212:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.IDS[Addr - 202];
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Over_Trigger */
|
||||
case 213 ... 221:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.Over_Trigger[Addr - 213];
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Equipment */
|
||||
case 222 ... 226:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.Equipment[Addr - 222];
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> E9 */
|
||||
case 227 ... 245:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.E9[Addr - 227];
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Device_Type */
|
||||
case 246:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.Device_Type;
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Sensor */
|
||||
case 247:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.Sensor;
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Alarm_value */
|
||||
case 248:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.Alarm_value;
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Alarm_ubit */
|
||||
case 249:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.Alarm_ubit;
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Start_Time */
|
||||
case 250 ... 260:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.Start_Time[Addr - 250];
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Alarm_Time */
|
||||
case 261 ... 266:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.Alarm_Time[Addr - 261];
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Alarm */
|
||||
case 267 ... 272:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.Alarm[Addr - 267];
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Data_ID2 */
|
||||
case 273:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.Data_ID2;
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Collection_event_ID2 */
|
||||
case 274:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.Collection_event_ID2;
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Report_ID2 */
|
||||
case 275:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.Report_ID2;
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Sub_Device_Type */
|
||||
case 276 ... 277:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.Sub_Device_Type[Addr - 276];
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> Sub_Device_State */
|
||||
case 278 ... 279:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.Sub_Device_State[Addr - 278];
|
||||
} break;
|
||||
|
||||
/* Ԥ<><D4A4> State_Change_Time */
|
||||
case 280 ... 281:
|
||||
{
|
||||
Data = Usr_Flash.FlashData.State_Change_Time[Addr - 280];
|
||||
} break;
|
||||
|
||||
default:
|
||||
Data = 0;
|
||||
}
|
||||
return Data;
|
||||
}
|
||||
9
usr/protocol/proto_Para_Modbus.h
Normal file
9
usr/protocol/proto_Para_Modbus.h
Normal file
@@ -0,0 +1,9 @@
|
||||
#ifndef _PROTO_PARA_MODBUS_H_
|
||||
#define _PROTO_PARA_MODBUS_H_
|
||||
|
||||
#include "main.h"
|
||||
|
||||
#include "proto_Modbus.h"
|
||||
|
||||
extern proto_Modbus_t Para_Modbus;
|
||||
#endif
|
||||
1914
usr/protocol/proto_SECS2.c
Normal file
1914
usr/protocol/proto_SECS2.c
Normal file
File diff suppressed because it is too large
Load Diff
59
usr/protocol/proto_SECS2.h
Normal file
59
usr/protocol/proto_SECS2.h
Normal file
@@ -0,0 +1,59 @@
|
||||
#ifndef _PROTO_SECS2_H_
|
||||
#define _PROTO_SECS2_H_
|
||||
|
||||
#include "main.h"
|
||||
#include "proto_HSMS.h"
|
||||
|
||||
#define PROTO_SECS2_S1F3 (0x0103) /*<2A><><EFBFBD>ݲɼ<DDB2>*/
|
||||
#define PROTO_SECS2_S2F49 (0x0231) /*<2A>豸״̬Զ<CCAC>̿<EFBFBD><CCBF><EFBFBD>*/
|
||||
#define PROTO_SECS2_S1F1 (0x0101) /*<2A><><EFBFBD><EFBFBD>*/
|
||||
#define PROTO_SECS2_S6F11 (0x060B) /*<2A>豸<EFBFBD><E8B1B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
#define PROTO_SECS2_S6F12 (0x060C) /*ȷ<>ϱ<EFBFBD><CFB1><EFBFBD>*/
|
||||
#define PROTO_SECS2_S1F13 (0x010D) /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
#define PROTO_SECS2_S2F31 (0x021F) /*ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬Ŷ<CCAC>ı<EFBFBD><C4B1>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ<EFBFBD><D2AA>Ӧ*/
|
||||
#define PROTO_ALARM_CHANGE_RX_WAIT (1)
|
||||
#define PROTO_STATE_CHANGE_RX_WAIT (1)
|
||||
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
#define PROTO_SECS2_DATA_TYPE_List 000/*<2A>˽<EFBFBD><CBBD><EFBFBD>*/
|
||||
#define PROTO_SECS2_DATA_TYPE_Binary 010
|
||||
#define PROTO_SECS2_DATA_TYPE_Bool 011
|
||||
#define PROTO_SECS2_DATA_TYPE_ASCII 020
|
||||
#define PROTO_SECS2_DATA_TYPE_JIS_8 021
|
||||
#define PROTO_SECS2_DATA_TYPE_2Byte_char 022
|
||||
#define PROTO_SECS2_DATA_TYPE_8Byte_int 030
|
||||
#define PROTO_SECS2_DATA_TYPE_1Byte_int 031
|
||||
#define PROTO_SECS2_DATA_TYPE_2Byte_int 032
|
||||
#define PROTO_SECS2_DATA_TYPE_4Byte_int 034
|
||||
#define PROTO_SECS2_DATA_TYPE_8Byte_float 040
|
||||
#define PROTO_SECS2_DATA_TYPE_4Byte_float 044
|
||||
#define PROTO_SECS2_DATA_TYPE_8Byte_uint 050
|
||||
#define PROTO_SECS2_DATA_TYPE_1Byte_uint 051
|
||||
#define PROTO_SECS2_DATA_TYPE_2Byte_uint 052
|
||||
#define PROTO_SECS2_DATA_TYPE_4Byte_uint 054
|
||||
|
||||
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>*/
|
||||
typedef struct
|
||||
{
|
||||
void *pData; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ*/
|
||||
u8 w_bit; /*<2A>Ƿ<EFBFBD><C7B7><EFBFBD>Ҫ<EFBFBD><D2AA>Ӧ*/
|
||||
u8 DataType; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
u8 ByteLen; /*<2A>ֽڳ<D6BD><DAB3><EFBFBD>*/
|
||||
u8 DataNum; /*<2A><><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>*/
|
||||
}proto_SECS2_MessageData_t;
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u32 sys_count;
|
||||
void (*Rx_DataAnalysis)(proto_HSMS_Header_Data_t *,u8 *,u16);
|
||||
void (*Tx_Alarm_Task)(void);
|
||||
void (*Tx_Dev_State_Task)(void);
|
||||
}proto_SECS2_t;
|
||||
|
||||
|
||||
extern proto_SECS2_t SECS2;
|
||||
#endif
|
||||
10
usr/protocol/proto_Transform.c
Normal file
10
usr/protocol/proto_Transform.c
Normal file
@@ -0,0 +1,10 @@
|
||||
#include "proto_Transform.h"
|
||||
#include "proto_CS200.h"
|
||||
#include "string.h"
|
||||
|
||||
|
||||
|
||||
void proto_Transform_Task(void)
|
||||
{
|
||||
|
||||
}
|
||||
9
usr/protocol/proto_Transform.h
Normal file
9
usr/protocol/proto_Transform.h
Normal file
@@ -0,0 +1,9 @@
|
||||
#ifndef _PROTO_TRANSFORM_H_
|
||||
#define _PROTO_TRANSFORM_H_
|
||||
|
||||
#include "main.h"
|
||||
u8 proto_AA55_to_Modbus_Unit(u8 AA55_Uint);
|
||||
u8 proto_Modbus_to_AA55_Unit(u8 Modbus_Uint);
|
||||
void proto_Transform_Task(void);
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user