91 changed files with 8314 additions and 300 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,55 @@ |
|||
#include "app_task_speech.h" |
|||
#define START_CODE 0x7E |
|||
#define END_CODE 0xEF |
|||
TS_TASK_SPEECH ts_speech; |
|||
|
|||
void L3_task_speech_init(void) |
|||
{ |
|||
U8 i; |
|||
L1_task_init(&ts_speech.task); |
|||
L3_task_s_go(ts_speech,D_task_init); |
|||
for(i=0;i<CC_SPEECH_INFO;i++) |
|||
{ |
|||
ts_speech.cc_speech_info[i].mask = 0; |
|||
} |
|||
ts_speech.cc_speech_info[0].oper = SPEECH_NAME_PLAY; |
|||
ts_speech.cc_speech_info[0].mask = 0; |
|||
} |
|||
void L3_task_speech_handle(TS_tcp *s) |
|||
{ |
|||
|
|||
} |
|||
|
|||
U8 L3_pack_speech_A3(TS_SPEECH *pspeech , U8 *tcp_buf ,U8 *buf)//tcp传来的buf
|
|||
{ |
|||
long name; |
|||
U8 bufsize = 9; |
|||
pspeech->start = START_CODE; |
|||
pspeech->num = 0x07; |
|||
pspeech->oper = SPEECH_NAME_PLAY; |
|||
pspeech->title = 0x43; |
|||
name = hexToDec(&tcp_buf); |
|||
tcp_buf[0] = (int)(name/100); |
|||
tcp_buf[1] = (int)((name%100)/10); |
|||
tcp_buf[2] = (int)(name%10); |
|||
Lc_hex2ascii(&tcp_buf,&pspeech->buf,3); |
|||
pspeech->crc = (pspeech->num + pspeech->oper + pspeech->buf[0] + pspeech->buf[1] + pspeech->buf[2] + pspeech->buf[3])>> 0 & 0xFF//累加和校验
|
|||
pspeech->end = END_CODE; |
|||
|
|||
return bufsize; |
|||
} |
|||
U8 L3_pack_ccmodbus(TS_SPEECH *pspeech , CC_SPEECH_INFO *speech_info) |
|||
{ |
|||
U16 pkglen = 0; |
|||
switch(speech_info->oper) |
|||
{ |
|||
case SPEECH_NAME_PLAY: |
|||
pkglen = L3_pack_ccmodbus_03(pspeech,tcp_buf,speech_info->buf); |
|||
break; |
|||
default: |
|||
break; |
|||
} |
|||
pccmodbus->num = pkglen; |
|||
return pkglen + 3; |
|||
} |
|||
|
@ -0,0 +1,47 @@ |
|||
#ifndef _APP_TASK_SPEECH_H |
|||
#define _APP_TASK_SPEECH_H |
|||
#define CC_SPEECH_INFO_MAX 1 |
|||
#define D_s_TS_speech_max 32 |
|||
|
|||
enum SPEECH_OPER |
|||
{ |
|||
SPEECH_NAME_PLAY 0xA3; |
|||
}; |
|||
|
|||
typedef struct |
|||
{ |
|||
vU8 start; |
|||
vU8 num; |
|||
vU8 oper; |
|||
vU8 title; |
|||
vU8 buf[D_s_TS_speech_max - 3]; |
|||
vU8 crc; |
|||
vU8 end; |
|||
}TS_SPEECH; |
|||
|
|||
typedef struct |
|||
{ |
|||
U16 slaver; |
|||
U16 oper; |
|||
U16 reg; |
|||
U16 regnum; |
|||
U16 bytes; |
|||
U8 *buf; |
|||
U16 mask; |
|||
}CC_SPEECH_INFO; |
|||
|
|||
typedef struct |
|||
{ |
|||
TS_task task; |
|||
U16 slaverIndex; |
|||
U16 pkglen; |
|||
CC_SPEECH_INFO cc_speech_info[CC_SPEECH_INFO_MAX]; |
|||
}TS_TASK_SPEECH; |
|||
|
|||
extern TS_TASK_SPEECH ts_speech; |
|||
|
|||
|
|||
|
|||
|
|||
#endif |
|||
|
@ -0,0 +1,16 @@ |
|||
板级到app还有对芯片功能应用配置的一层 |
|||
|
|||
20210124 发现传统的TTSS架构中总是欠缺点 |
|||
例如一个外设芯片,因为不是mcu固有的外设,所以应该归到BSP(板级支持里面) |
|||
其读写寄存器等基本功能放在BSP中,但是其和app应用相关的模式却发现并不适合 |
|||
直接放到BSP中,也不适合放到APP中,因为实际的应用只是使用外设获得IO数据 |
|||
而已。故而修正 |
|||
|
|||
main: |
|||
app: |
|||
asp:基于mcu外设或者板级外设芯片的功能,这些功能为app服务,但是功能配置复杂,单独列出,方便移植。 |
|||
bsp:外设芯片自身功能,如果芯片为app服务的函数功能比较单一,不像无线芯片一样配置复杂的话那么也可以放在bsp中 |
|||
msp:mcu自身的外设功能,如果特别复杂,比如类似MAC驱动等,可以把一部分接近app的功能放到asp中 |
|||
clib: |
|||
ctask: |
|||
tpc:协议相关 |
@ -0,0 +1,82 @@ |
|||
#ifndef __SDX1_H__ |
|||
#define __SDX1_H__ |
|||
|
|||
/*★★★★★★★★★★★★★★★★★★★★★★★★
|
|||
《振南的znFAT--嵌入式FAT32文件系统设计与实现》 |
|||
一书[上下册]已经由北航出版社正式出版发行。 |
|||
此书是振南历经3年多时间潜心编著,是现今市面上唯 |
|||
一一套讲述FAT32文件系统、SD卡等嵌入式存储技术的 |
|||
专著。书中还介绍了大量的编程技巧与振南的开发经验。 |
|||
请在各大网络销售平台搜索“znFAT”,即可购买。 |
|||
在全国各大书店也有售。 |
|||
振南的ZN-X开发板,支持51、AVR、STM32(M0/M3/M4)等 |
|||
CPU。此板可与书配套,板上各种精彩的实验实例请详见 |
|||
振南网站www.znmcu.cn |
|||
★★★★★★★★★★★★★★★★★★★★★★★★*/ |
|||
|
|||
/***************************************************************************************
|
|||
★程序模块:【振南ZN-X开发板】上『SD卡1』驱动程序 〖STC51部分:STC15L2K60S2〗 |
|||
★功能描述:实现了SD卡的扇区读写、多扇区读写、扇区擦除、读取总物理扇区数等功能 |
|||
此驱动可支持几乎所有的SD卡,包括MMC/SD/SDHC |
|||
★配套教程与参考资料: |
|||
●《振南的znFAT--嵌入式FAT32文件系统设计与实验》一书 下册 第11章《SD卡物理驱动》 |
|||
●《振南的单片机高级外设系列视频教程》之《SD卡专辑》 |
|||
****************************************************************************************/ |
|||
|
|||
|
|||
#include "../bsp/bsp_config.h"///#include "sd_type.h" |
|||
#include "znfat.h"///#include "sd_type.h" |
|||
|
|||
////#include <STC15Fxxxx.H>
|
|||
|
|||
sbit SD1_CS =P5^5; //SD卡片选 输入
|
|||
|
|||
|
|||
#define D_FILE_SECTOR 65544 |
|||
|
|||
|
|||
#define SET_SD1_CS_PIN(val) (SD1_CS =val) |
|||
|
|||
#define TRY_TIME 200 //向SD卡写入命令之后,读取SD卡的回应次数,即读TRY_TIME次,如果在TRY_TIME次中读不到回应,产生超时错误,命令写入失败
|
|||
|
|||
#define TRY_TIME2 200 //add by cc
|
|||
//相关宏定义
|
|||
//-------------------------------------------------------------
|
|||
#define SD_VER_ERR 0X00 |
|||
#define SD_VER_MMC 0X01 |
|||
#define SD_VER_V1 0X02 |
|||
#define SD_VER_V2 0X03 |
|||
#define SD_VER_V2HC 0X04 |
|||
|
|||
#define INIT_ERROR 0x01 //初始化错误
|
|||
#define INIT_CMD0_ERROR 0x02 //CMD0错误
|
|||
#define INIT_CMD1_ERROR 0x03 //CMD1错误
|
|||
#define INIT_SDV2_ACMD41_ERROR 0x04 //ACMD41错误
|
|||
#define INIT_SDV1_ACMD41_ERROR 0x05 //ACMD41错误
|
|||
|
|||
#define WRITE_CMD24_ERROR 0x06 //写块时产生CMD24错误
|
|||
#define WRITE_BLOCK_ERROR 0x07 //写块错误
|
|||
|
|||
#define READ_BLOCK_ERROR 0x08 //读块错误
|
|||
|
|||
#define WRITE_CMD25_ERROR 0x09 //在连续多块写时产生CMD25错误
|
|||
#define WRITE_NBLOCK_ERROR 0x0A //连续多块写失败
|
|||
|
|||
#define READ_CMD18_ERROR 0x0B //在连续多块读时产生CMD18错误
|
|||
|
|||
#define GET_CSD_ERROR 0x0C //读CSD失败
|
|||
|
|||
//-------------------------------------------------------------
|
|||
UINT8 SD1_Init(); //SD卡初始化
|
|||
|
|||
UINT8 L1_SD_Wsector(UINT32 addr,UINT8 *buffer); //将buffer数据缓冲区中的数据写入地址为addr的扇区中
|
|||
UINT8 L1_SD_Rsector(UINT32 addr,UINT8 *buffer); //从地址为addr的扇区中读取数据到buffer数据缓冲区中
|
|||
UINT8 SD1_Write_nSector(UINT32 nsec,UINT32 addr,UINT8 *buffer); //将buffer数据缓冲区中的数据写入起始地址为addr的nsec个连续扇区中
|
|||
UINT8 SD1_Read_nSector(UINT32 nsec,UINT32 addr,UINT8 *buffer); //将buffer数据缓冲区中的数据写入起始地址为addr的nsec个连续扇区中
|
|||
UINT8 SD1_Erase_nSector(UINT32 addr_sta,UINT32 addr_end); |
|||
UINT32 SD1_GetTotalSec(void); //获取SD卡的总扇区数
|
|||
UINT8 L2_SD_Rsector(UINT16 addr,UINT8 *buffer);////从
|
|||
UINT8 L2_SD_Wsector(UINT16 addr,UINT8 *buffer); |
|||
UINT8 L2_SD_Erase_nSector(UINT16 addr_sta,UINT16 addr_end); |
|||
|
|||
#endif |
@ -0,0 +1,278 @@ |
|||
#include "asp_oid.h" |
|||
|
|||
TS_task_oid_ ts_task_oid; |
|||
|
|||
Ts_OID_frame_xy_ oid_buf[POINT_LEN+10]; |
|||
Ts_OID_frame_xy_ points[POINT_LEN+10]; |
|||
|
|||
|
|||
|
|||
|
|||
#define D_TASK_OID_t1 0x11 |
|||
#define D_TASK_OID_XY 0x12 |
|||
#define TTSS_TASK_OID_STA 0x13 |
|||
#define D_TASK_PEN_UP 0x14 |
|||
#define TTSS_TASK_OID_WRITE 0x15 |
|||
#define TTSS_TASK_OID_SEND 0x16 |
|||
|
|||
|
|||
void L3_task_oid_handle(TS_task_oid_ *s) |
|||
{ |
|||
|
|||
TTSS_Task_init(); |
|||
TTSS_Alarm_init(s->tts,1000); |
|||
///(X) = s_nos_tick.t_10ms + delay;
|
|||
L2_task_go(D_TASK_OID_t1); |
|||
TTSS_Task_step(D_TASK_OID_t1) |
|||
if(TTSS_Alarm_AT(s->tts)) |
|||
{///if( (X) < s_nos_tick.jiffies)
|
|||
TTSS_Alarm_init(s->tts,1000); |
|||
s->p_ok = 1; |
|||
s->ts_frame.flag.sta = D_PEN_none;//超时没有数据
|
|||
s->ts_frame.cd.xy100.x100 = 0; |
|||
s->ts_frame.cd.xy100.y100 = 0; |
|||
s->ts_frame.flag.angle= 0; |
|||
s->ts_frame.time= D_sys_now; |
|||
L2_task_go(TTSS_TASK_OID_WRITE); |
|||
} |
|||
else if(ts_oid.oid_p) |
|||
{ |
|||
ts_oid.oid_p = 0; |
|||
TTSS_Alarm_init(s->tts,1000); |
|||
s->ts_frame.flag.sta = D_PEN_gcode; |
|||
s->ts_frame.cd.gcode = ts_oid.gCode; |
|||
s->ts_frame.time= D_sys_now; |
|||
//L0_uart2_sendArray((U8 *)&s->ts_frame,(U16)10);
|
|||
//Lc_buf_copy_uc((U8 *)&R.points[0],(U8 *)&s->ts_frame,(U16)10);
|
|||
//s->extra = 1;
|
|||
//s->can_send = 1;
|
|||
s->send_p = 1; |
|||
L2_task_go(TTSS_TASK_OID_WRITE); |
|||
} |
|||
else |
|||
{ |
|||
L2_task_go(D_TASK_OID_XY); |
|||
} |
|||
TTSS_Task_step(D_TASK_OID_XY) |
|||
if(ts_oid.oid_x) |
|||
{ |
|||
ts_oid.oid_x = 0; |
|||
TTSS_Alarm_init(s->tts,1000); |
|||
s->ts_frame.cd.xy100.x100 = ts_oid.X100; |
|||
s->ts_frame.cd.xy100.y100 = ts_oid.Y100; |
|||
s->ts_frame.flag.packageNo = 0; |
|||
s->ts_frame.flag.angle = ts_oid.angle; |
|||
s->ts_frame.time = ts_oid.time; |
|||
L2_task_go(TTSS_TASK_OID_STA); |
|||
} |
|||
else |
|||
{ |
|||
L2_task_go(D_TASK_PEN_UP); |
|||
} |
|||
TTSS_Task_step(TTSS_TASK_OID_STA) |
|||
if(ts_oid.pre_x == 0 && ts_oid.pre_y == 0 && ts_oid.X100 != 0 &&ts_oid.Y100 != 0) |
|||
{ |
|||
s->ts_frame.flag.sta = D_PEN_down; |
|||
L2_task_go(TTSS_TASK_OID_WRITE); |
|||
} |
|||
else if(ts_oid.pre_x != 0 && ts_oid.pre_y != 0&& ts_oid.X100 != 0 &&ts_oid.Y100 != 0) |
|||
{ |
|||
s->ts_frame.flag.sta = D_PEN_normal; |
|||
L2_task_go(TTSS_TASK_OID_WRITE); |
|||
} |
|||
TTSS_Task_step(D_TASK_PEN_UP) |
|||
if(G.pen_up && G.pen_t) |
|||
{ |
|||
G.pen_up = 0; |
|||
s->send_t =1; |
|||
TTSS_Alarm_init(s->tts,1000); |
|||
s->ts_frame.flag.sta = D_PEN_up; |
|||
s->ts_frame.time = D_sys_now; |
|||
ts_oid.X100 = 0; |
|||
ts_oid.Y100 = 0; |
|||
ts_oid.time = 0; |
|||
ts_oid.angle = 0; |
|||
L2_task_go(TTSS_TASK_OID_WRITE); |
|||
} |
|||
else |
|||
{ |
|||
L2_task_go(D_TASK_OID_t1); |
|||
} |
|||
TTSS_Task_step(TTSS_TASK_OID_WRITE) |
|||
//L0_uart2_sendArray((U8 *)&s->ts_frame,(U16)10);
|
|||
Lc_buf_copy_uc((U8 *)&oid_buf[s->point],(U8 *)&s->ts_frame,(U16)10); |
|||
s->point ++; |
|||
L2_task_go(TTSS_TASK_OID_SEND); |
|||
TTSS_Task_step(TTSS_TASK_OID_SEND) |
|||
if(((s->point) > (POINT_LEN - 1))|| s->send_t||s->p_ok||s->send_p) |
|||
{ |
|||
U8 j; |
|||
U16 k; |
|||
s->extra = s->point; |
|||
s->point = 0; |
|||
s->p_ok = 0; |
|||
s->send_p = 0; |
|||
s->send_t = 0; |
|||
for(j = 0;j<s->extra;j++) |
|||
{ |
|||
Lc_buf_copy_uc((U8 *)&points[j],(U8 *)&oid_buf[j],(U16)10); |
|||
//L0_uart2_sendArray((U8 *)&points[j],(U16)10);
|
|||
} |
|||
//G.ccmd_slaver_info[1].buf = (U8*)&points;
|
|||
//G.ccmd_slaver_info[1].extra_num = (s->extra)*5;
|
|||
//L0_uart2_sendArray((U8 *)&points,(s->extra)*10);
|
|||
//s->extra = 0;
|
|||
s->can_send = 1; |
|||
#if 0 |
|||
for(j = 0;j<k;j++) |
|||
{ |
|||
L0_uart2_sendArray((U8 *)&oid_buf[j],(U16)10); |
|||
L0_uart2_uc(' '); |
|||
} |
|||
#endif |
|||
L2_task_go(D_TASK_OID_t1); |
|||
} |
|||
else |
|||
{ |
|||
L2_task_go(D_TASK_OID_t1); |
|||
} |
|||
TTSS_Task_end(); |
|||
} |
|||
|
|||
|
|||
|
|||
void L1_oid_init(void) |
|||
{ |
|||
|
|||
L0_Oid_Init(); |
|||
LD_Oid_SCK_LOW(); |
|||
|
|||
L1_task_init(&ts_task_oid.task); |
|||
ts_task_oid.can_send = 0; |
|||
ts_task_oid.p_ok = 0; |
|||
ts_task_oid.point = 0; |
|||
L3_task_s_go(ts_task_oid,D_task_init); |
|||
} |
|||
|
|||
|
|||
|
|||
void L1_oid_main(void) |
|||
{ |
|||
|
|||
} |
|||
|
|||
#ifdef doc2342342 |
|||
命令1个字节 |
|||
|
|||
//// fa 00 |00 04 00 03 46 A9
|
|||
//// buf 0 1 |2 3 4 5 6 7
|
|||
|
|||
//// fa 00 |35 20 10 55 05 06
|
|||
| | |cmd |
|||
|-filter | dat |
|||
oid cmd -| |
|||
|
|||
////读取2010 fa 0d |36 20 10 55 05 06
|
|||
|
|||
#endif |
|||
|
|||
|
|||
|
|||
|
|||
void L1_oid_debug(u8 *para) |
|||
{ |
|||
uint32_t r; |
|||
TS_oid_cmd *t =(TS_oid_cmd *)para; |
|||
// ET0 = 0;
|
|||
L0_uart0_sendArray("\r\noid debug:",13); |
|||
//// fa 00 |00 04 00 03 46 A9
|
|||
//// buf 0 1 |2 3 4 5 6 7
|
|||
|
|||
//// fa 00 |11 20 10 55 05 06
|
|||
//// UDCMD_wakeup
|
|||
|
|||
//// fa 00 |22 20 42 53 64 75
|
|||
//// cmd=20
|
|||
switch(t->cmd) |
|||
{ |
|||
case UDCMD_wakeup: |
|||
L0_uart0_sendstr("\r\nL1_OID_WakeUp "); |
|||
L1_OID_WakeUp(); |
|||
break; |
|||
case UDCMD_cmdsend: |
|||
///fa 00 22 cmd 42 53 64 75
|
|||
///fa 00 |22 cmd 42 53 64 75
|
|||
L0_uart0_sendstr("\r\ncmd:"); |
|||
L0_uart0_uchex(t->dat);L0_uart0_0d0a(); |
|||
L1_oid_TransCmd(t->dat); |
|||
break; |
|||
case UDCMD_log: |
|||
L0_uart0_sendstr("\r\nLogRegister"); |
|||
/// LogRegister();
|
|||
break; |
|||
case UDCMD_CheckVersion: |
|||
L0_uart0_sendstr("\r\n CheckVersion"); |
|||
/// L1_oid_CheckVersionAndInit(eAppDevice);
|
|||
// while(1)
|
|||
{ |
|||
// OidTaskLoop();
|
|||
} |
|||
break; |
|||
case UDCMD_get: |
|||
L0_uart0_sendstr("\r\n UDCMD_get"); |
|||
while(9) |
|||
{ |
|||
L1_Oid_readoid(); |
|||
|
|||
} |
|||
|
|||
break; |
|||
case UDCMD_readreg: |
|||
|
|||
///fa 00 22 cmd 42 53 64 75
|
|||
///fa 00 |22 cmd 42 53 64 75
|
|||
r = L1_oidReadRegister (t->reg); |
|||
|
|||
L0_uart0_sendstr("\r\n read reg:"); |
|||
L0_uart0_ushex(t->reg); |
|||
Lc_delay_ms(1); |
|||
L0_uart0_sendstr(" = "); |
|||
L0_uart0_ulhex(r); |
|||
|
|||
L0_uart0_uc(0x09); |
|||
break; |
|||
#if 0 |
|||
case UDCMD_testtime_us: |
|||
L0_uart0_sendstr("\r\nUDCMD_testtime_us"); |
|||
L0_uart0_uchex(t->dat);L0_uart0_0d0a(); |
|||
while(9) |
|||
{ |
|||
/// delay_us(t->dat);
|
|||
D_IO_LEDkey1_ON(); |
|||
// delay_us(t->dat);
|
|||
D_IO_LEDkey1_OFF(); |
|||
} |
|||
break; |
|||
|
|||
case UDCMD_testtime_ms: |
|||
L0_uart0_sendstr("\r\nUDCMD_testtime_ms"); |
|||
L0_uart0_uchex(t->dat);L0_uart0_0d0a(); |
|||
|
|||
while(9) |
|||
{ |
|||
/// delay_ms(t->dat);
|
|||
D_IO_LEDkey1_ON(); |
|||
// delay_ms(t->dat);
|
|||
D_IO_LEDkey1_OFF(); |
|||
} |
|||
break; |
|||
#endif |
|||
default: |
|||
L0_uart0_sendstr("\r\ncmd error!!"); |
|||
L0_uart0_0d0a(); |
|||
break; |
|||
} |
|||
ET0 = 1; |
|||
} |
|||
|
|||
|
@ -0,0 +1,139 @@ |
|||
#ifndef __asp_oid_H__ |
|||
#define __asp_oid_H__ |
|||
|
|||
/**************************************************************************************
|
|||
asp_oid.c |
|||
****************************************************************************************/ |
|||
|
|||
#include "../bsp/bsp_oid.h" |
|||
|
|||
#include "msp_uart0.h" |
|||
|
|||
#include "../ctask/task.h" |
|||
#include "../app/app_config.h" |
|||
|
|||
/**********
|
|||
|
|||
``````` `\___________________/` ` ` ` ` ` ` `````````\___________________/```````` |
|||
222222 2 21000000000000000000032 2 2 2 2 2 2 222222221000000000000000000032222222 |
|||
package no 0 1 2 3 0 1 2 3 |
|||
package no 0 1 2 3 4 5 6 7 |
|||
packageNo 00000111112222233333xxxxx xxxxxxxxxxx00000111112222233333xxxxx |
|||
|
|||
111111111 12222222 |
|||
123456789012345678 901234567890 |
|||
|
|||
gcode收到固定码 |
|||
坐标码 |
|||
按下开始, |
|||
个数累计到了, |
|||
或者抬起 |
|||
都要发送 |
|||
|
|||
寄存器模式: 一般指的是单个变量的保存,写入和读取按寄存器号读取即可 |
|||
缓存模式:数据连续放入某个缓存,然后进行批量读取,缓存号(地址)可以作为寄存器 |
|||
|
|||
|
|||
************/ |
|||
/*******************.
|
|||
|
|||
write to uart -->send |
|||
|
|||
Layer3: app tcp |
|||
|
|||
s->ts_frame.cd->R.point |
|||
|
|||
----------------------------- |
|||
状态判断,数据缓存 |
|||
|
|||
Layer2: asp asp_oid |
|||
|
|||
ts.oid ->s->ts_frame.cd |
|||
|
|||
------------------------- |
|||
L1_Oid_readoid |
|||
|
|||
Layer1: bsp: bsp_oid 最底层的点的采样 |
|||
|
|||
*******************/ |
|||
#define POINT_LEN 20///cc fixme
|
|||
|
|||
typedef struct |
|||
{///6Byte
|
|||
U16 x100; |
|||
U16 y100; |
|||
}TS_xy100; |
|||
typedef union{ |
|||
TS_xy100 xy100; |
|||
U32 gcode; |
|||
}TU_code; |
|||
|
|||
#define D_PEN_normal 0 |
|||
#define D_PEN_down 1 |
|||
#define D_PEN_none 2 |
|||
#define D_PEN_up 3 |
|||
#define D_PEN_gcode 4 |
|||
typedef struct |
|||
{ |
|||
U16 angle:9;///360
|
|||
U16 packageNo:4; ///0-2^5
|
|||
U16 sta:3; /// =0 nomal =1 按下 =3 抬起 =2 没有按下 =4 gcode
|
|||
}Oid_flag; |
|||
////一帧数据,也是一个点
|
|||
typedef struct |
|||
{ |
|||
Oid_flag flag; |
|||
TU_code cd; |
|||
TtimeStamp time; ///最好一个包一个时间戳 一个点(一帧)一个时间戳有点浪费
|
|||
/// 前提1 是采样的点是固定间隔而且连续
|
|||
////时间戳甚至是相对的 甚至误差相对于采样而言也比较大
|
|||
}Ts_OID_frame_xy_;///8Bytes
|
|||
|
|||
typedef struct _s_task_oid_ |
|||
{ |
|||
TS_task task; |
|||
|
|||
vU8 can_send;///
|
|||
U16 p_ok;///
|
|||
U16 send_t; |
|||
TtimeStamp tts; |
|||
U16 point; |
|||
U16 extra; |
|||
U16 send_p; |
|||
Ts_OID_frame_xy_ ts_frame; |
|||
/// Ts_OID_out_ out;
|
|||
|
|||
}TS_task_oid_; |
|||
extern TS_task_oid_ ts_task_oid; |
|||
extern void L3_task_oid_handle(TS_task_oid_ *s); |
|||
extern Ts_OID_frame_xy_ oid_buf[POINT_LEN+10]; |
|||
extern Ts_OID_frame_xy_ points[POINT_LEN+10]; |
|||
|
|||
|
|||
|
|||
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>for debug
|
|||
typedef struct _ts_debug_oid_cmd_ |
|||
{///6bytes 去掉了filter和命令字
|
|||
U8 cmd; |
|||
/// U8 rw; /// 写还是读: =1 读,=0写
|
|||
U8 dat; ///数据
|
|||
U16 reg; ///
|
|||
U16 end; ///
|
|||
}TS_oid_cmd; |
|||
|
|||
#define UDCMD_wakeup 0x11 ///
|
|||
#define UDCMD_cmdsend 0x22 ///
|
|||
#define UDCMD_readreg 0x23 ///
|
|||
#define UDCMD_log 0x33 ///
|
|||
#define UDCMD_get 0x44 ///
|
|||
#define UDCMD_CheckVersion 0x45 ///
|
|||
#define UDCMD_testtime_us 0x55 ///
|
|||
#define UDCMD_testtime_ms 0x66 ///
|
|||
|
|||
///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<for debug
|
|||
|
|||
extern void L1_oid_init(void); |
|||
extern void L1_oid_main(void); |
|||
extern void L1_oid_debug(u8 *para); |
|||
|
|||
#endif |
@ -0,0 +1,22 @@ |
|||
#ifndef asp_SI24R1_ |
|||
#define asp_SI24R1_ |
|||
|
|||
进入时钟停振模式时不建议开LVD 和比较器。如果确实需要用,建议开启掉电唤醒定时器,掉电唤醒定时器只会增加约1.4uA的耗电, |
|||
|
|||
这个耗电一般系统是可以接受的。让掉电唤醒定时器每5秒唤醒一次 MCU,唤醒后可用LVD、比较器、 ADC检测外部电池电压, |
|||
检测工作约耗时 1mS后再进入时钟停振/省电模式,这样增加的平均电流小于1uA,则整体功耗大约为2.8uA(0.4uA+1.4uA+1uA)。
|
|||
|
|||
|
|||
|
|||
|
|||
mcu上电初始化后,进入掉电模式, |
|||
启动掉电定时器,每5秒启动一次查询各种状态 |
|||
gsensor 设置为动作后输出中断,其io连接mcu有唤醒功能的管脚, |
|||
然后系统开始工作,工作完成后立即休息,然后再定时 |
|||
|
|||
|
|||
#endif |
|||
|
|||
|
|||
|
|||
|
@ -0,0 +1,853 @@ |
|||
#include "asp_sdx1.h" |
|||
///#include "myfun.h"
|
|||
////#include "sd_type.h"
|
|||
#include "bsp_sd1_iospi.h" |
|||
|
|||
/*★★★★★★★★★★★★★★★★★★★★★★★★
|
|||
《振南的znFAT--嵌入式FAT32文件系统设计与实现》 |
|||
一书[上下册]已经由北航出版社正式出版发行。 |
|||
此书是振南历经3年多时间潜心编著,是现今市面上唯 |
|||
一一套讲述FAT32文件系统、SD卡等嵌入式存储技术的 |
|||
专著。书中还介绍了大量的编程技巧与振南的开发经验。 |
|||
请在各大网络销售平台搜索“znFAT”,即可购买。 |
|||
在全国各大书店也有售。 |
|||
振南的ZN-X开发板,支持51、AVR、STM32(M0/M3/M4)等 |
|||
CPU。此板可与书配套,板上各种精彩的实验实例请详见 |
|||
振南网站www.znmcu.cn |
|||
★★★★★★★★★★★★★★★★★★★★★★★★*/ |
|||
|
|||
/***************************************************************************************
|
|||
★程序模块:【振南ZN-X开发板】上『SD卡1』驱动程序 〖STC51部分:STC15L2K60S2〗 |
|||
★功能描述:实现了SD卡的扇区读写、多扇区读写、扇区擦除、读取总物理扇区数等功能 |
|||
此驱动可支持几乎所有的SD卡,包括MMC/SD/SDHC |
|||
★配套教程与参考资料: |
|||
●《振南的znFAT--嵌入式FAT32文件系统设计与实验》一书 下册 第11章《SD卡物理驱动》 |
|||
●《振南的单片机高级外设系列视频教程》之《SD卡专辑》 |
|||
****************************************************************************************/ |
|||
|
|||
//变量定义
|
|||
//--------------------------------------------------------------
|
|||
extern UINT8 Low_or_High1; //在IOSPI中定义
|
|||
|
|||
UINT8 SD1_Addr_Mode=0; //SD1的寻址方式,1为块寻址,0为字节寻址
|
|||
UINT8 SD1_Ver=SD_VER_ERR; //SD卡1的版本
|
|||
//---------------------------------------------------------------
|
|||
|
|||
#define SD1_SPI_SPEED_HIGH() Low_or_High1=0 |
|||
|
|||
#define SD1_SPI_SPEED_LOW() Low_or_High1=1 |
|||
|
|||
#define SD1_SPI_WByte(x) SD1_IOSPI_RWByte(x) |
|||
|
|||
#define SD1_SPI_RByte() SD1_IOSPI_RWByte(0XFF) |
|||
|
|||
/********************************************************************
|
|||
- 功能描述:【振南ZN-X开发板】上『SD卡1』SPI接口初始化 |
|||
- 参数说明:无 |
|||
- 返回说明:0 |
|||
- 注:SPI接口初始化后,首先工作在低速模式。SD卡在初始化的过程中要求 |
|||
SPI速度要比较低,原则上不高于400KHZ,经验值为240KHZ。如果发现 |
|||
SD卡初始化不成功,还可继续降低SPI速度,实现速度起决于电路与SD |
|||
卡品质。 |
|||
********************************************************************/ |
|||
|
|||
UINT8 SD1_SPI_Init(void) |
|||
{ |
|||
SD1_IOSPI_Init(); //SPI接口初始化
|
|||
|
|||
return 0; |
|||
} |
|||
|
|||
/******************************************************************
|
|||
- 功能描述:向SD卡写命令 |
|||
- 参数说明:SD卡的命令是6个字节,pcmd是指向命令字节序列的指针 |
|||
- 返回说明:命令写入不成功,将返回0xff |
|||
******************************************************************/ |
|||
|
|||
UINT8 SD1_Write_Cmd(UINT8 *pcmd) |
|||
{ |
|||
UINT8 r=0,time=0; |
|||
|
|||
SET_SD1_CS_PIN(1); |
|||
SD1_SPI_WByte(0xFF); //发送8个时钟,提高兼容性,如果没有这里,有些SD卡可能不支持
|
|||
|
|||
SET_SD1_CS_PIN(0); |
|||
while(0XFF!=SD1_SPI_RByte()) |
|||
{/// add by cc for没有SD卡应退出
|
|||
; //等待SD卡准备好,再向其发送命令
|
|||
time++; |
|||
L0_uart0_uc(0x30+time); |
|||
if(time>=200) |
|||
{ |
|||
L0_uart0_uc('E'); |
|||
L0_uart0_0d0a(); |
|||
SET_SD1_CS_PIN(1); |
|||
return(INIT_CMD0_ERROR);//CMD0写入失败
|
|||
} |
|||
} |
|||
//将6字节的命令序列写入SD卡
|
|||
SD1_SPI_WByte(pcmd[0]); |
|||
SD1_SPI_WByte(pcmd[1]); |
|||
SD1_SPI_WByte(pcmd[2]); |
|||
SD1_SPI_WByte(pcmd[3]); |
|||
SD1_SPI_WByte(pcmd[4]); |
|||
SD1_SPI_WByte(pcmd[5]); |
|||
|
|||
if(pcmd[0]==0X1C) SD1_SPI_RByte(); //如果是停止命令,跳过多余的字节
|
|||
|
|||
do |
|||
{ |
|||
r=SD1_SPI_RByte(); |
|||
time++; |
|||
}while((r&0X80)&&(time<TRY_TIME)); //如果重试次数超过TRY_TIME则返回错误
|
|||
|
|||
return r; |
|||
} |
|||
|
|||
/******************************************************************
|
|||
读单块block和读多块block |
|||
SD卡读单块和多块的命令分别为CMD17和CMD18,他们的参数即要读的区域的开始地址。 |
|||
因为考虑到一般SD卡的读写要求地址对齐,所以一般我们都将地址转为块, |
|||
并以扇区(块)(512Byte)为单位进行读写, |
|||
比如读扇区0参数就为0,读扇区1参数就为1<<9(即地址512), |
|||
读扇区2参数就为2<<9(即地址1024),依此类推。 |
|||
|
|||
- 功能描述:SD卡初始化,针对于不同的SD卡,如MMC、SD或SDHC,初始化 |
|||
方法是不同的 |
|||
- 参数说明:无 |
|||
- 返回说明:调用成功,返回0x00,否则返回错误码 |
|||
******************************************************************/ |
|||
|
|||
UINT8 SD1_Init(void) |
|||
{ |
|||
UINT8 time=0,r=0,i=0; |
|||
|
|||
UINT8 rbuf[4]={0}; |
|||
|
|||
UINT8 pCMD0[6] ={0x40,0x00,0x00,0x00,0x00,0x95}; //CMD0,将SD卡从默认上电后的SD模式切换到SPI模式,使SD卡进入IDLE状态
|
|||
UINT8 pCMD1[6] ={0x41,0x00,0x00,0x00,0x00,0x01}; //CMD1,MMC卡使用CMD1命令进行初始化
|
|||
UINT8 pCMD8[6] ={0x48,0x00,0x00,0x01,0xAA,0x87}; //CMD8,用于鉴别SD卡的版本,并可从应答得知SD卡的工作电压
|
|||
UINT8 pCMD16[6]={0x50,0x00,0x00,0x02,0x00,0x01}; //CMD16,设置扇区大小为512字节,此命令用于在初始化完成之后进行试探性的操作,
|
|||
//如果操作成功,说明初始化确实成功
|
|||
UINT8 pCMD55[6]={0x77,0x00,0x00,0x00,0x00,0x01}; //CMD55,用于告知SD卡后面是ACMD,即应用层命令 CMD55+ACMD41配合使用
|
|||
//MMC卡使用CMD1来进行初始化,而SD卡则使用CMD55+ACMD41来进行初始化
|
|||
UINT8 pACMD41H[6]={0x69,0x40,0x00,0x00,0x00,0x01}; //ACMD41,此命令用于检测SD卡是否初始化完成,MMC卡,不适用此命令,针对2.0的SD卡
|
|||
UINT8 pACMD41S[6]={0x69,0x00,0x00,0x00,0x00,0x01}; //ACMD41,此命令用于检测SD卡是否初始化完成,MMC卡,不适用此命令,针对1.0的SD卡
|
|||
|
|||
UINT8 pCMD58[6]={0x7A,0x00,0x00,0x00,0x00,0x01}; //CMD58,用于鉴别SD2.0到底是SDHC,还是普通的SD卡,二者对扇区地址的寻址方式不同
|
|||
|
|||
SD1_SPI_Init(); //SPI接口相关初始化
|
|||
|
|||
SD1_SPI_SPEED_LOW(); //首先将SPI切为低速
|
|||
|
|||
SET_SD1_CS_PIN(1); |
|||
|
|||
for(i=0;i<0x0f;i++) //首先要发送最少74个时钟信号,这是必须的!激活SD卡
|
|||
{ |
|||
SD1_SPI_WByte(0xff); //120个时钟
|
|||
} |
|||
|
|||
L0_uart0_uc('5'); L0_uart0_uc(0x09); L0_uart0_uc('5'); L0_uart0_uc(0x09); |
|||
|
|||
time=0; |
|||
do |
|||
{ |
|||
r=SD1_Write_Cmd(pCMD0);//写入CMD0
|
|||
time++; |
|||
if(time>= TRY_TIME2) |
|||
{ |
|||
L0_uart0_uc(0x09); |
|||
L0_uart0_uc('R'); |
|||
L0_uart0_uc(0x09); |
|||
return(INIT_CMD0_ERROR);//CMD0写入失败
|
|||
} |
|||
}while(r!=0x01); |
|||
L0_uart0_uc(0x09); |
|||
L0_uart0_uc('6'); |
|||
L0_uart0_uc(0x09); |
|||
|
|||
if(1==SD1_Write_Cmd(pCMD8))//写入CMD8,如果返回值为1,则SD卡版本为2.0
|
|||
{ |
|||
L0_uart0_sendstr("SDver:2.0\r\n");/////4g卡
|
|||
rbuf[0]=SD1_SPI_RByte(); rbuf[1]=SD1_SPI_RByte(); //读取4个字节的R7回应,通过它可知此SD卡是否支持2.7~3.6V的工作电压
|
|||
rbuf[2]=SD1_SPI_RByte(); rbuf[3]=SD1_SPI_RByte(); |
|||
|
|||
if(rbuf[2]==0X01 && rbuf[3]==0XAA)//SD卡是否支持2.7~3.6V
|
|||
{ |
|||
L0_uart0_sendstr("2.7~3.6V=");/////4g卡
|
|||
|
|||
time=0; |
|||
do |
|||
{ |
|||
SD1_Write_Cmd(pCMD55);//写入CMD55
|
|||
r=SD1_Write_Cmd(pACMD41H);//写入ACMD41,针对SD2.0
|
|||
time++; |
|||
if(time>=TRY_TIME) |
|||
{ |
|||
return(INIT_SDV2_ACMD41_ERROR);//对SD2.0使用ACMD41进行初始化时产生错误
|
|||
} |
|||
}while(r!=0); |
|||
|
|||
if(0==SD1_Write_Cmd(pCMD58)) //写入CMD58,开始鉴别SD2.0
|
|||
{ |
|||
rbuf[0]=SD1_SPI_RByte(); rbuf[1]=SD1_SPI_RByte(); //读取4个字节的OCR,其中CCS指明了是SDHC还是普通的SD
|
|||
rbuf[2]=SD1_SPI_RByte(); rbuf[3]=SD1_SPI_RByte(); |
|||
|
|||
if(rbuf[0]&0x40) |
|||
{ |
|||
SD1_Ver=SD_VER_V2HC; //SDHC卡
|
|||
SD1_Addr_Mode=1; //SDHC卡的扇区寻址方式是扇区地址
|
|||
} |
|||
else SD1_Ver=SD_VER_V2; //普通的SD卡,2.0的卡包含SDHC和一些普通的卡
|
|||
|
|||
} |
|||
|
|||
if(!SD1_Addr_Mode) |
|||
{ |
|||
//addr = addr * 512 将块地址(扇区地址)转为字节地址
|
|||
L0_uart0_uc(0x30+SD1_Addr_Mode); |
|||
L0_uart0_sendstr("<<9 \r\n");/////4g卡
|
|||
} |
|||
else |
|||
{ |
|||
L0_uart0_uc(0x30+SD1_Addr_Mode); |
|||
L0_uart0_sendstr("1 mass adr \r\n");/////4g卡
|
|||
} |
|||
|
|||
} |
|||
} |
|||
else //SD V1.0或MMC
|
|||
{ |
|||
L0_uart0_sendstr("SD V1.0 or MMC \r\n"); |
|||
//SD卡使用ACMD41进行初始化,而MMC使用CMD1来进行初始化,依此来进一步判断是SD还是MMC
|
|||
SD1_Write_Cmd(pCMD55);//写入CMD55
|
|||
r=SD1_Write_Cmd(pACMD41S);//写入ACMD41,针对SD1.0
|
|||
|
|||
if(r<=1) //检查返回值是否正确,如果正确,说明ACMD41命令被接受,即为SD卡
|
|||
{ |
|||
SD1_Ver=SD_VER_V1; //普通的SD1.0卡,一般来说容量不会超过2G
|
|||
|
|||
time=0; |
|||
do |
|||
{ |
|||
SD1_Write_Cmd(pCMD55);//写入CMD55
|
|||
r=SD1_Write_Cmd(pACMD41S);//写入ACMD41,针对SD1.0
|
|||
time++; |
|||
if(time>=TRY_TIME) |
|||
{ |
|||
return(INIT_SDV1_ACMD41_ERROR);//对SD1.0使用ACMD41进行初始化时产生错误
|
|||
} |
|||
}while(r!=0); |
|||
} |
|||
else //否则为MMC
|
|||
{ |
|||
SD1_Ver=SD_VER_MMC; //MMC卡,它不支持ACMD41命令,而是使用CMD1进行初始化
|
|||
|
|||
time=0; |
|||
do |
|||
{ |
|||
r=SD1_Write_Cmd(pCMD1);//写入CMD1
|
|||
time++; |
|||
if(time>=TRY_TIME) |
|||
{ |
|||
return(INIT_CMD1_ERROR);//MMC卡使用CMD1命令进行初始化中产生错误
|
|||
} |
|||
}while(r!=0); |
|||
} |
|||
} |
|||
|
|||
if(0!=SD1_Write_Cmd(pCMD16)) //SD卡的块大小必须为512字节
|
|||
{ |
|||
SD1_Ver=SD_VER_ERR; //如果不成功,则此卡为无法识别的卡
|
|||
return INIT_ERROR; |
|||
} |
|||
|
|||
SET_SD1_CS_PIN(1); |
|||
SD1_SPI_WByte(0xFF); //按照SD卡的操作时序在这里补8个时钟
|
|||
|
|||
SD1_SPI_SPEED_HIGH(); //SPI切到高速
|
|||
|
|||
return 0;//返回0,说明复位操作成功
|
|||
} |
|||
|
|||
/******************************************************************
|
|||
- 功能描述:对SD卡若干个扇区进行擦除,擦除后扇区中的数据大部分情况 |
|||
下为全0(有些卡擦除后为全0XFF,如要使用此函数,请确认) |
|||
- 参数说明:addr_sta:开始扇区地址 addr_end:结束扇区地址 |
|||
- 返回说明:调用成功,返回0x00,否则返回错误码 |
|||
|
|||
add by cc 如果addr_sta=addr_end 命令无效,一次至少擦除两个扇区 |
|||
CMD32 ERASE_WR_BLK_START Mandatory |
|||
|
|||
CMD33 ERASE_WR_BLK_END Mandatory |
|||
|
|||
CMD38 ERASE Mandatory |
|||
|
|||
Class5 (擦除卡命令集): |
|||
|
|||
CMD32:设置擦除块的起始地址. |
|||
|
|||
CMD33:设置擦除块的终止地址. |
|||
|
|||
CMD38: 擦除所选择的块. |
|||
|
|||
|
|||
******************************************************************/ |
|||
|
|||
UINT8 SD1_Erase_nSector(UINT32 addr_sta,UINT32 addr_end) |
|||
{ |
|||
UINT8 r,time; |
|||
UINT8 i=0; |
|||
UINT8 pCMD32[]={0x60,0x00,0x00,0x00,0x00,0xff}; //设置擦除的开始扇区地址
|
|||
UINT8 pCMD33[]={0x61,0x00,0x00,0x00,0x00,0xff}; //设置擦除的结束扇区地址
|
|||
UINT8 pCMD38[]={0x66,0x00,0x00,0x00,0x00,0xff}; //擦除扇区
|
|||
|
|||
if(!SD1_Addr_Mode) |
|||
{ |
|||
addr_sta<<=9;addr_end<<=9; |
|||
//addr = addr * 512 将块地址(扇区地址)转为字节地址
|
|||
|
|||
} |
|||
|
|||
pCMD32[1]=addr_sta>>24; //将开始地址写入到CMD32字节序列中
|
|||
pCMD32[2]=addr_sta>>16; |
|||
pCMD32[3]=addr_sta>>8; |
|||
pCMD32[4]=addr_sta; |
|||
|
|||
pCMD33[1]=addr_end>>24; //将开始地址写入到CMD32字节序列中
|
|||
pCMD33[2]=addr_end>>16; |
|||
pCMD33[3]=addr_end>>8; |
|||
pCMD33[4]=addr_end; |
|||
|
|||
time=0; |
|||
do |
|||
{ |
|||
r=SD1_Write_Cmd(pCMD32); |
|||
time++; |
|||
if(time==TRY_TIME) |
|||
{ |
|||
return(r); //命令写入失败
|
|||
} |
|||
}while(r!=0); |
|||
|
|||
time=0; |
|||
do |
|||
{ |
|||
r=SD1_Write_Cmd(pCMD33); |
|||
time++; |
|||
if(time==TRY_TIME) |
|||
{ |
|||
return(r); //命令写入失败
|
|||
} |
|||
}while(r!=0); |
|||
|
|||
time=0; |
|||
do |
|||
{ |
|||
r=SD1_Write_Cmd(pCMD38); |
|||
time++; |
|||
if(time==TRY_TIME) |
|||
{ |
|||
return(r); //命令写入失败
|
|||
} |
|||
}while(r!=0); |
|||
|
|||
return 0; |
|||
|
|||
} |
|||
|
|||
/****************************************************************************
|
|||
- 功能描述:将buffer指向的512个字节的数据写入到SD卡的addr扇区中 |
|||
- 参数说明:addr:扇区地址 |
|||
buffer:指向数据缓冲区的指针 |
|||
- 返回说明:调用成功,返回0x00,否则返回错误码 |
|||
- 注:SD卡初始化成功后,读写扇区时,尽量将SPI速度提上来,提高效率 |
|||
|
|||
cc modify :tf卡的读写次数是10W次,就按1万次来算,3600s 一个小时36000十个小时 |
|||
****************************************************************************/ |
|||
|
|||
UINT8 L1_SD_Wsector(UINT32 addr,UINT8 *buffer) //向SD卡中的指定地址的扇区写入512个字节,使用CMD24(24号命令)
|
|||
{ |
|||
UINT8 r,time; |
|||
UINT16 i=0; |
|||
UINT8 pCMD24[]={0x58,0x00,0x00,0x00,0x00,0xff}; //向SD卡中单个块(512字节,一个扇区)写入数据,用CMD24
|
|||
|
|||
if(!SD1_Addr_Mode) |
|||
{ |
|||
addr<<=9; //addr = addr * 512 将块地址(扇区地址)转为字节地址
|
|||
} |
|||
|
|||
pCMD24[1]=addr>>24; //将字节地址写入到CMD24字节序列中
|
|||
pCMD24[2]=addr>>16; |
|||
pCMD24[3]=addr>>8; |
|||
pCMD24[4]=addr; |
|||
|
|||
time=0; |
|||
do |
|||
{ |
|||
r=SD1_Write_Cmd(pCMD24); |
|||
time++; |
|||
if(time==TRY_TIME) |
|||
{ |
|||
|
|||
SET_SD1_CS_PIN(1); |
|||
return(r); //命令写入失败
|
|||
} |
|||
}while(r!=0); |
|||
|
|||
while(0XFF!=SD1_SPI_RByte()); //等待SD卡准备好,再向其发送命令及后续的数据
|
|||
|
|||
SD1_SPI_WByte(0xFE);//写入开始字节 0xfe,后面就是要写入的512个字节的数据
|
|||
|
|||
for(i=0;i<512;i++) //将缓冲区中要写入的512个字节写入SD1卡,减少循环次数,提高数据写入速度
|
|||
{ |
|||
SD1_SPI_WByte(*(buffer++)); |
|||
|
|||
/**SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));
|
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));**/ |
|||
} |
|||
|
|||
SD1_SPI_WByte(0xFF); |
|||
SD1_SPI_WByte(0xFF); //两个字节的CRC校验码,不用关心
|
|||
|
|||
r=SD1_SPI_RByte(); //读取返回值
|
|||
if((r & 0x1F)!=0x05) //如果返回值是 XXX00101 说明数据已经被SD卡接受了
|
|||
{ |
|||
return(WRITE_BLOCK_ERROR); //写块数据失败
|
|||
} |
|||
|
|||
while(0xFF!=SD1_SPI_RByte());//等到SD卡不忙(数据被接受以后,SD卡要将这些数据写入到自身的FLASH中,需要一个时间)
|
|||
//忙时,读回来的值为0x00,不忙时,为0xff
|
|||
|
|||
SET_SD1_CS_PIN(1); |
|||
SD1_SPI_WByte(0xFF); //按照SD卡的操作时序在这里补8个时钟
|
|||
|
|||
return(0); //返回0,说明写扇区操作成功
|
|||
} |
|||
|
|||
|
|||
UINT8 L2_SD_Rsector(UINT16 addr,UINT8 *buffer)//从SD卡的指定扇区中读出512个字节,使用CMD17(17号命令)
|
|||
{ |
|||
UINT32 addr32 = D_FILE_SECTOR; |
|||
addr32 += (UINT32)addr; |
|||
return L1_SD_Rsector(addr32,buffer); |
|||
} |
|||
UINT8 L2_SD_Wsector(UINT16 addr,UINT8 *buffer) //向SD卡中的指定地址的扇区写入512个字节,使用CMD24(24号命令)
|
|||
{ |
|||
UINT32 addr32 = D_FILE_SECTOR; |
|||
addr32 += (UINT32)addr; |
|||
return L1_SD_Wsector(addr32,buffer); |
|||
|
|||
} |
|||
UINT8 L2_SD_Erase_nSector(UINT16 addr_sta,UINT16 addr_end) |
|||
{ |
|||
UINT32 addr32= D_FILE_SECTOR,addr32end= D_FILE_SECTOR; |
|||
addr32 += (UINT32)addr_sta; |
|||
addr32end += (UINT32)addr_end; |
|||
return SD1_Erase_nSector(addr32,addr32end); |
|||
|
|||
} |
|||
|
|||
|
|||
|
|||
/****************************************************************************
|
|||
- 功能描述:读取addr扇区的512个字节到buffer指向的数据缓冲区 |
|||
- 参数说明:addr:扇区地址 |
|||
buffer:指向数据缓冲区的指针 |
|||
- 返回说明:调用成功,返回0x00,否则返回错误码 |
|||
- 注:SD卡初始化成功后,读写扇区时,尽量将SPI速度提上来,提高效率 |
|||
****************************************************************************/ |
|||
|
|||
UINT8 L1_SD_Rsector(UINT32 addr,UINT8 *buffer)//从SD卡的指定扇区中读出512个字节,使用CMD17(17号命令)
|
|||
{ |
|||
UINT16 i; |
|||
UINT8 time,r; |
|||
|
|||
UINT8 pCMD17[]={0x51,0x00,0x00,0x00,0x00,0x01}; //CMD17的字节序列
|
|||
|
|||
if(!SD1_Addr_Mode) |
|||
{ |
|||
addr<<=9; //sector = sector * 512 将块地址(扇区地址)转为字节地址
|
|||
} |
|||
|
|||
pCMD17[1]=addr>>24; //将字节地址写入到CMD17字节序列中
|
|||
pCMD17[2]=addr>>16; |
|||
pCMD17[3]=addr>>8; |
|||
pCMD17[4]=addr; |
|||
|
|||
L0_uart0_uc('Q'); |
|||
|
|||
time=0; |
|||
do |
|||
{ |
|||
r=SD1_Write_Cmd(pCMD17); //写入CMD17
|
|||
time++; |
|||
///L0_uart0_uc(0x30+time);
|
|||
if(time==TRY_TIME) |
|||
{ |
|||
L0_uart0_uc('T'); |
|||
SET_SD1_CS_PIN(1); |
|||
return(READ_BLOCK_ERROR); //读块失败
|
|||
} |
|||
}while(r!=0); |
|||
|
|||
L0_uart0_uc('A'); |
|||
time = 0; |
|||
while(SD1_SPI_RByte()!= 0xFE) |
|||
{ //一直读,当读到0xfe时,说明后面的是512字节的数据了
|
|||
time++; |
|||
///L0_uart0_uc(0x30+time);
|
|||
if(time==TRY_TIME) |
|||
{ |
|||
L0_uart0_uc('F'); |
|||
SET_SD1_CS_PIN(1); |
|||
return(READ_BLOCK_ERROR); //读块失败
|
|||
} |
|||
} |
|||
|
|||
//L0_uart0_uc('i');
|
|||
|
|||
for(i=0;i<512;i++) //将数据写入到数据缓冲区中
|
|||
{ |
|||
*(buffer++)=SD1_SPI_RByte(); |
|||
/**
|
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
|
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
|
|||
|
|||
**/ |
|||
} |
|||
|
|||
SD1_SPI_RByte(); |
|||
SD1_SPI_RByte();//读取两个字节的CRC校验码,不用关心它们
|
|||
|
|||
SET_SD1_CS_PIN(1); |
|||
SD1_SPI_WByte(0xFF); //按照SD1卡的操作时序在这里补8个时钟
|
|||
|
|||
return 0; |
|||
} |
|||
|
|||
|
|||
#if 0 |
|||
|
|||
/****************************************************************************
|
|||
- 功能描述:向addr扇区开始的nsec个扇区写入数据(★硬件多扇区写入) |
|||
- 参数说明:nsec:扇区数 |
|||
addr:开始扇区地址 |
|||
buffer:指向数据缓冲区的指针 |
|||
- 返回说明:调用成功,返回0x00,否则返回错误码 |
|||
- 注:SD卡初始化成功后,读写扇区时,尽量将SPI速度提上来,提高效率 |
|||
****************************************************************************/ |
|||
|
|||
UINT8 SD1_Write_nSector(UINT32 nsec,UINT32 addr,UINT8 *buffer) |
|||
{ |
|||
UINT8 r,time; |
|||
UINT32 i=0,j=0,m=0; |
|||
|
|||
UINT8 pCMD25[6]={0x59,0x00,0x00,0x00,0x00,0x01}; //CMD25用于完成多块连续写
|
|||
UINT8 pCMD55[6]={0x77,0x00,0x00,0x00,0x00,0x01}; //CMD55,用于告知SD卡后面是ACMD,CMD55+ACMD23
|
|||
UINT8 pACMD23[6]={0x57,0x00,0x00,0x00,0x00,0x01};//CMD23,多块连续预擦除
|
|||
|
|||
if(!SD1_Addr_Mode) addr<<=9; |
|||
|
|||
pCMD25[1]=addr>>24; |
|||
pCMD25[2]=addr>>16; |
|||
pCMD25[3]=addr>>8; |
|||
pCMD25[4]=addr; |
|||
|
|||
pACMD23[1]=nsec>>24; |
|||
pACMD23[2]=nsec>>16; |
|||
pACMD23[3]=nsec>>8; |
|||
pACMD23[4]=nsec; |
|||
|
|||
if(SD1_Ver!=SD_VER_MMC) //如果不是MMC卡,则首先写入预擦除命令,CMD55+ACMD23,这样后面的连续块写的速度会更快
|
|||
{ |
|||
SD1_Write_Cmd(pCMD55); |
|||
SD1_Write_Cmd(pACMD23); |
|||
} |
|||
|
|||
time=0; |
|||
do |
|||
{ |
|||
r=SD1_Write_Cmd(pCMD25); |
|||
time++; |
|||
if(time==TRY_TIME) |
|||
{ |
|||
return(WRITE_CMD25_ERROR); //命令写入失败
|
|||
} |
|||
}while(r!=0); |
|||
|
|||
while(0XFF!=SD1_SPI_RByte()); //等待SD卡准备好,再向其发送命令及后续的数据
|
|||
|
|||
for(j=0;j<nsec;j++) |
|||
{ |
|||
SD1_SPI_WByte(0xFC);//写入开始字节 0xfc,后面就是要写入的512个字节的数据
|
|||
|
|||
for(i=0;i<4;i++) //将缓冲区中要写入的512个字节写入SD卡
|
|||
{ |
|||
for(m=0;m<32*4;m++) //将缓冲区中要写入的512个字节写入SD卡
|
|||
{ |
|||
SD1_SPI_WByte(*(buffer+m)); |
|||
} |
|||
/***
|
|||
|
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++));SD1_SPI_WByte(*(buffer++)); |
|||
|
|||
|
|||
**/ |
|||
|
|||
} |
|||
|
|||
SD1_SPI_WByte(0xFF); |
|||
SD1_SPI_WByte(0xFF); //两个字节的CRC校验码,不用关心
|
|||
|
|||
r=SD1_SPI_RByte(); //读取返回值
|
|||
if((r & 0x1F)!=0x05) //如果返回值是 XXX00DELAY_TIME1 说明数据已经被SD卡接受了
|
|||
{ |
|||
return(WRITE_NBLOCK_ERROR); //写块数据失败
|
|||
} |
|||
|
|||
while(0xFF!=SD1_SPI_RByte());//等到SD卡不忙(数据被接受以后,SD卡要将这些数据写入到自身的FLASH中,需要一个时间)
|
|||
//忙时,读回来的值为0x00,不忙时,为0xff
|
|||
} |
|||
|
|||
SD1_SPI_WByte(0xFD); |
|||
|
|||
while(0xFF!=SD1_SPI_RByte()); |
|||
|
|||
SET_SD1_CS_PIN(1);//关闭片选
|
|||
|
|||
SD1_SPI_WByte(0xFF);//按照SD卡的操作时序在这里补8个时钟
|
|||
|
|||
return(0); //返回0,说明写扇区操作成功
|
|||
} |
|||
|
|||
/****************************************************************************
|
|||
- 功能描述:读取addr扇区开始的nsec个扇区的数据(★硬件多扇区读取) |
|||
- 参数说明:nsec:扇区数 |
|||
addr:开始扇区地址 |
|||
buffer:指向数据缓冲区的指针 |
|||
- 返回说明:调用成功,返回0x00,否则返回错误码 |
|||
- 注:SD卡初始化成功后,读写扇区时,尽量将SPI速度提上来,提高效率 |
|||
****************************************************************************/ |
|||
|
|||
UINT8 SD_Read_nSector(UINT32 nsec,UINT32 addr,UINT8 *buffer) |
|||
{ |
|||
UINT8 r,time; |
|||
UINT32 i=0,j=0; |
|||
|
|||
UINT8 pCMD18[6]={0x52,0x00,0x00,0x00,0x00,0x01}; //CMD18的字节序列
|
|||
UINT8 pCMD12[6]={0x1C,0x00,0x00,0x00,0x00,0x01}; //CMD12,强制停止命令
|
|||
|
|||
if(!SD1_Addr_Mode) addr<<=9; //sector = sector * 512 将块地址(扇区地址)转为字节地址
|
|||
|
|||
pCMD18[1]=addr>>24; //将字节地址写入到CMD17字节序列中
|
|||
pCMD18[2]=addr>>16; |
|||
pCMD18[3]=addr>>8; |
|||
pCMD18[4]=addr; |
|||
|
|||
time=0; |
|||
do |
|||
{ |
|||
r=SD1_Write_Cmd(pCMD18); //写入CMD18
|
|||
time++; |
|||
if(time==TRY_TIME) |
|||
{ |
|||
return(READ_CMD18_ERROR); //写入CMD18失败
|
|||
} |
|||
}while(r!=0); |
|||
|
|||
for(j=0;j<nsec;j++) |
|||
{ |
|||
while(SD1_SPI_RByte()!= 0xFE); //一直读,当读到0xfe时,说明后面的是512字节的数据了
|
|||
|
|||
for(i=0;i<4;i++) //将数据写入到数据缓冲区中
|
|||
{ |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte();*(buffer++)=SD1_SPI_RByte(); |
|||
} |
|||
|
|||
SD1_SPI_RByte(); |
|||
SD1_SPI_RByte();//读取两个字节的CRC校验码,不用关心它们
|
|||
} |
|||
|
|||
SD1_Write_Cmd(pCMD12); //写入CMD12命令,停止数据读取
|
|||
|
|||
SET_SD1_CS_PIN(1); |
|||
SD1_SPI_WByte(0xFF); //按照SD卡的操作时序在这里补8个时钟
|
|||
|
|||
return 0; |
|||
} |
|||
|
|||
/****************************************************************************
|
|||
- 功能描述:获取SD卡的总扇区数(通过读取SD卡的CSD寄器组计算得到总扇区数) |
|||
- 参数说明:无 |
|||
- 返回说明:返回SD卡的总扇区数 |
|||
- 注:无 |
|||
****************************************************************************/ |
|||
|
|||
UINT32 SD1_GetTotalSec(void) |
|||
{ |
|||
UINT8 pCSD[16]; |
|||
UINT32 Capacity; |
|||
UINT8 n,i; |
|||
UINT16 csize; |
|||
|
|||
UINT8 pCMD9[6]={0x49,0x00,0x00,0x00,0x00,0x01}; //CMD9
|
|||
|
|||
if(SD1_Write_Cmd(pCMD9)!=0) //写入CMD9命令
|
|||
{ |
|||
return GET_CSD_ERROR; //获取CSD时产生错误
|
|||
} |
|||
|
|||
while(SD1_SPI_RByte()!= 0xFE); //一直读,当读到0xfe时,说明后面的是16字节的CSD数据
|
|||
|
|||
for(i=0;i<16;i++) pCSD[i]=SD1_SPI_RByte(); //读取CSD数据
|
|||
|
|||
SD1_SPI_RByte(); |
|||
SD1_SPI_RByte(); //读取两个字节的CRC校验码,不用关心它们
|
|||
|
|||
SET_SD1_CS_PIN(1); |
|||
SD1_SPI_WByte(0xFF); //按照SD卡的操作时序在这里补8个时钟
|
|||
|
|||
//如果为SDHC卡,即大容量卡,按照下面方式计算
|
|||
if((pCSD[0]&0xC0)==0x40) //SD2.0的卡
|
|||
{ |
|||
csize=pCSD[9]+(((UINT16)(pCSD[8]))<<8)+1; |
|||
Capacity=((UINT32)csize)<<10;//得到扇区数
|
|||
} |
|||
else //SD1.0的卡
|
|||
{ |
|||
n=(pCSD[5]&0x0F)+((pCSD[10]&0x80)>>7)+((pCSD[9]&0x03)<<1)+2; |
|||
csize=(pCSD[8]>>6)+((UINT16)pCSD[7]<<2)+((UINT16)(pCSD[6]&0x03)<<0x0A)+1; |
|||
Capacity=(UINT32)csize<<(n-9);//得到扇区数
|
|||
} |
|||
return Capacity; |
|||
} |
|||
|
|||
#endif |
|||
|
|||
|
|||
|
File diff suppressed because it is too large
@ -0,0 +1,113 @@ |
|||
#ifndef asp_SI24R1m_ |
|||
#define asp_SI24R1m_ |
|||
|
|||
|
|||
#include "bsp_SI24R1.h" |
|||
typedef struct |
|||
{ |
|||
u8 TX[5]; ///发送基地址
|
|||
u8 RX_P0[5]; ///接收P0基地址
|
|||
u8 P1_base[5]; ///P1地址 (前4字节)P2-P5基地址
|
|||
u8 P[4]; ///P2-P5偏移地址,根据规格,在地地址5Byte的前提下,P1-P5四个字节的需要一样,后一个字节可以作为区分
|
|||
///u8 d32[]
|
|||
}TS_addr_2g4_; |
|||
|
|||
///// 默认所有的地址的基地址是一样的,这样策略比较简单
|
|||
typedef struct |
|||
{ |
|||
u8 x;///
|
|||
u8 y;///
|
|||
u8 z;///
|
|||
/// U8 ackFlag;
|
|||
}TS_xyz_; |
|||
|
|||
///// 默认所有的地址的基地址是一样的,这样策略比较简单
|
|||
typedef struct |
|||
{ |
|||
u8 filter0;///
|
|||
u8 filter1;///
|
|||
TS_xyz_ xyz[30];///
|
|||
/// U8 ackFlag;
|
|||
}TS_d32_; |
|||
|
|||
|
|||
typedef struct |
|||
{ |
|||
TS_task task; |
|||
u8 Rbuf[32]; |
|||
u8 Tbuf[32]; |
|||
u8 Tbuf_change; |
|||
U8 val; |
|||
U8 con; ///config
|
|||
U8 sta; |
|||
U8 sta_show; |
|||
U8 fifo_sta; |
|||
U8 id; |
|||
U32 sendStamp; |
|||
U32 over; |
|||
U8 rx_en; |
|||
U8 rx_ch;///有接收数据的通道号
|
|||
U8 rx_fifo_num;////RX_PW_P0-5 接收数据管道n的数据数量
|
|||
|
|||
U8 ok; |
|||
U8 tx_en; |
|||
U8 rs_mode;///发送或接收的模式
|
|||
Modbus03 *m; |
|||
/// U8 ackFlag;
|
|||
}TS_2g4_; |
|||
extern TS_2g4_ ts_2g4; |
|||
void L3_task_2g4_handle_NOACK_master(TS_2g4_ *s); |
|||
///void (*L3_task_2g4_handle)(TS_2g4_ *s);
|
|||
void L2_SI24R1_init_config(void); |
|||
extern void (*L3_task_2g4_handle)(TS_2g4_ *s); |
|||
|
|||
|
|||
|
|||
|
|||
#define D_MSC_1V6_P0 0x20/// master slave communication 1v6 通讯地址配置
|
|||
#define D_MSC_1V6_P1 0x21/// master slave communication 1v6 通讯地址配置
|
|||
#define D_MSC_1V6_P2 0x22/// master slave communication 1v6 通讯地址配置
|
|||
#define D_MSC_1V6_P3 0x23/// master slave communication 1v6 通讯地址配置
|
|||
#define D_MSC_1V6_P4 0x24/// master slave communication 1v6 通讯地址配置
|
|||
#define D_MSC_1V6_P5 0x25/// master slave communication 1v6 通讯地址配置
|
|||
|
|||
|
|||
|
|||
#define D_SI24_Standby(); D_SI24_CE_OFF(); |
|||
#define D_SI24_Work(); D_SI24_CE_ON(); |
|||
#define D_SI24_Register(); D_SI24_CE_OFF(); |
|||
|
|||
|
|||
#define D_task_2g4_send 0x51 |
|||
#define D_task_2g4_listen 0x61 |
|||
#define D_task_2g4_REV 0x62 |
|||
#define D_task_2g4_REV_start 0x82 |
|||
|
|||
#define D_task_2g4_rev_what 0x72 |
|||
|
|||
#define D_task_2g4_send_over 0x63 |
|||
#define D_task_2g4_send_next 0x64 |
|||
|
|||
#define D_task_2g4_rx 0x52 |
|||
#define D_task_2g4_wait 0x53 |
|||
#define D_task_2g4_ackPayload_UPDATE 0x54 |
|||
|
|||
|
|||
|
|||
#define D_SI24R1_SENDOK 1 |
|||
#define D_SI24R1_MAX_RT 2 |
|||
#define D_SI24R1_ER 3 |
|||
#define D_SI24R1_TIMEOVER 4 |
|||
|
|||
#define D_SI24R1_RX_DR 6 |
|||
|
|||
|
|||
extern void L2_task_2g4_init(void); |
|||
void L2_task_2g4_handle_NOACK(TS_2g4_ *s); |
|||
|
|||
|
|||
#endif |
|||
|
|||
|
|||
|
|||
|
@ -0,0 +1,123 @@ |
|||
#include "asp_task_WC.h" |
|||
|
|||
TS_WCapp_ ts_WCapp; |
|||
|
|||
|
|||
#define D_task_WC_send 0x51 |
|||
|
|||
#define D_task_WC_rx 0x52 |
|||
#define D_task_WC_wait 0x53 |
|||
#define D_task_WC_ack 0x54 |
|||
|
|||
|
|||
#define D_task_WC_listen 0x61 |
|||
#define D_task_WC_REV 0x62 |
|||
|
|||
#define D_task_WC_send_over 0x63 |
|||
#define D_task_WC_send_next 0x64 |
|||
|
|||
#define D_task_WC_REC_ACK 0x65 |
|||
#define D_task_WC_rev_what 0x72 |
|||
|
|||
#define D_task_WC_END 0x74 |
|||
|
|||
|
|||
void L2_task_WC_init(void) |
|||
{ |
|||
L1_task_init(&ts_WCapp.task); |
|||
L3_task_s_go(ts_WCapp,D_task_init); |
|||
} |
|||
|
|||
|
|||
////对应文字版流程图
|
|||
#ifdef doc909809 |
|||
从机流程图: 文本版,将来甚至可以直接生成流程图及代码。20210409 |
|||
step 1;进入接收模式 |
|||
step 2 判断: |
|||
接收到数据进入解析step 3 |
|||
未接收到一直等待 |
|||
step 3:解析 |
|||
如果是本机需要响应的命令 进入step4 |
|||
step 4:应答发送 |
|||
返回主机从机的信息 |
|||
step 5;显示信息 |
|||
|
|||
|
|||
测试步骤 |
|||
1,验证流程的逻辑完整性 |
|||
2,验证流程中每一步骤的时间合理性 |
|||
3,验证流程中每一步骤的功能分配的合理性 |
|||
4,验证流程和程序对应的正确性 |
|||
5,检查handdle调用入口的有效性(是否会被执行,以及分配时间的合理性) |
|||
6,检查任务初始化init的调用有效性,确保在handle执行前被调用 |
|||
7,检查init的打印是否正确 |
|||
8,分步骤检查,及打印 |
|||
9,模拟关键 |
|||
|
|||
#endif |
|||
|
|||
///L3_task_WC_handle_NOACK(&ts_WCapp);
|
|||
////目前使用的no ack 标准应用,发送和接收
|
|||
void L3_task_WC_master_handle(TS_WCapp_ *s) |
|||
{ |
|||
//---------------------------------------------------------------//
|
|||
TTSS_Task_init(): |
|||
L0_uart0_sendstr("mC:init\r\n"); |
|||
L2_SI24R1_init_config(); |
|||
L2_task_2g4_init(); |
|||
L2_task_go(D_task_WC_send); |
|||
TTSS_Task_step(D_task_WC_send): |
|||
L0_uart0_sendstr("\r\nmC:send "); |
|||
L3_task_s_go(ts_2g4,D_task_2g4_send); |
|||
TTSS_overtime_init(s->over,D_Tdelay_5s); |
|||
|
|||
L2_task_go(D_task_WC_send_over); |
|||
TTSS_Task_step(D_task_WC_send_over): |
|||
if (D_SI24R1_SENDOK == ts_2g4.ok) |
|||
{ |
|||
L0_uart0_sendstr("mC:ok rec ack\r\n"); |
|||
ts_2g4.ok = 0; |
|||
L3_task_s_go(ts_2g4,D_task_2g4_REV_start); |
|||
TTSS_overtime_init(s->over,D_Tdelay_10s); |
|||
L2_task_go(D_task_WC_REC_ACK); |
|||
}else |
|||
{ |
|||
TTSS_overtime_get(s->over) |
|||
L0_uart0_uc('v'); |
|||
L2_task_go(D_task_WC_END); |
|||
TTSS_overtime_end |
|||
} |
|||
TTSS_Task_step(D_task_WC_REC_ACK): |
|||
if(D_SI24R1_RX_DR == ts_2g4.ok) |
|||
{ |
|||
ts_2g4.ok = 0; |
|||
L0_uart0_sendstr("mC:recok \r\n"); |
|||
L0_uart0_sendArray(ts_2g4.Rbuf,ts_2g4.rx_fifo_num); |
|||
L2_task_go(D_task_WC_END); |
|||
}else |
|||
{ |
|||
TTSS_overtime_get(s->over) |
|||
///L0_uart0_uc('r');
|
|||
L0_uart0_sendstr("\r\nmC:!overtime \r\n"); |
|||
L2_task_go(D_task_WC_END); |
|||
L3_task_s_go(ts_2g4,D_task_close); |
|||
TTSS_overtime_end |
|||
} |
|||
TTSS_Task_step(D_task_WC_END): |
|||
L2_task_go(D_task_WC_send); |
|||
L1_task_Tdelay(D_Tdelay_2s); |
|||
TTSS_Task_end(); |
|||
(*L3_task_2g4_handle)(&ts_2g4); |
|||
|
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
@ -0,0 +1,39 @@ |
|||
#ifndef asp_task_WC_ |
|||
#define asp_task_WC_ |
|||
|
|||
|
|||
#define D_ID_0 0 |
|||
#define D_ID_1 1 |
|||
#define D_ID_2 2 |
|||
#define D_ID D_ID_0 |
|||
|
|||
#include "bsp_para2flash.h" |
|||
#include "../ctask/task.h" |
|||
#include "bsp_SI24R1.h" |
|||
#include "msp_UART0.h" |
|||
#include "asp_SI24R1m.h" |
|||
|
|||
|
|||
|
|||
typedef struct |
|||
{ |
|||
TS_task task; |
|||
U32 sendStamp; |
|||
U32 over; |
|||
|
|||
U8 ok; |
|||
Modbus03 *m; |
|||
/// U8 ackFlag;
|
|||
}TS_WCapp_; |
|||
extern TS_WCapp_ ts_WCapp; |
|||
|
|||
///L3_task_handle_NOACK_master(&ts_WCapp);
|
|||
void L2_task_WC_init(void); |
|||
|
|||
void L3_task_WC_master_handle(TS_WCapp_ *s); |
|||
|
|||
#endif |
|||
|
|||
|
|||
|
|||
|
@ -0,0 +1,826 @@ |
|||
#include "bsp_oid.h" |
|||
#include "intrins.h" |
|||
#include "msp_UART0.h" |
|||
#include <stdio.h> |
|||
#include "../ctask/task.h" |
|||
#include "../ctask/tick.h" |
|||
|
|||
|
|||
/******************************************************************************************************
|
|||
变量定义 |
|||
*******************************************************************************************************/ |
|||
AppDevice eAppDevice = ePointRead_2000A; |
|||
///volatile uint32_t RecvData[3];
|
|||
Ts_OID_ ts_oid; |
|||
|
|||
uint8_t TransCmd[7]; |
|||
///#define MAIN_Fosc 11059260L
|
|||
#if 0 |
|||
#define MAIN_Fosc (12459260L/4) |
|||
#define D_DELAY_10US 10 |
|||
#define D_DELAY_ROD_80US 80 |
|||
|
|||
|
|||
#else |
|||
#define MAIN_Fosc (12459260L/2) |
|||
#define D_DELAY_10US 20 |
|||
#define D_DELAY_ROD_80US 160 |
|||
|
|||
|
|||
#endif |
|||
|
|||
|
|||
//========================================================================
|
|||
// 函数: void delay_ms(uint8_t ms)
|
|||
// 描述: 延时函数。
|
|||
// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
|
|||
// 返回: none.
|
|||
// 版本: VER1.0
|
|||
// 日期: 2021-3-9
|
|||
// 备注:
|
|||
//========================================================================
|
|||
void delay_ms(uint8_t ms) |
|||
{ |
|||
uint16_t i; |
|||
do{ |
|||
i = MAIN_Fosc / 10000L; |
|||
while(--i); //10T per loop
|
|||
}while(--ms); |
|||
} |
|||
|
|||
void delay_us(uint8_t us) |
|||
{ |
|||
uint16_t i; |
|||
do{ |
|||
// i = MAIN_Fosc / 10000000L;
|
|||
// i = 1;///5 10 150u 1---50us
|
|||
/// while(--i); //10T per loop
|
|||
}while(--us); |
|||
} |
|||
|
|||
/******************************************************************************************************
|
|||
Function: |
|||
Input: |
|||
Output: |
|||
*******************************************************************************************************/ |
|||
void L0_oid_SendCmd(uint8_t Cmd) |
|||
{ |
|||
uint8_t i; |
|||
LD_Oid_SDIO_OUT(); |
|||
LD_Oid_SCK_HIGH(); |
|||
LD_Oid_SDIO_HIGH(); // Write control bit
|
|||
delay_us(D_DELAY_10US); |
|||
LD_Oid_SCK_LOW(); |
|||
delay_us(D_DELAY_10US); |
|||
|
|||
for(i=0;i<8;i++) |
|||
{ |
|||
LD_Oid_SCK_HIGH(); |
|||
if(Cmd & 0x80) |
|||
{ |
|||
LD_Oid_SDIO_HIGH(); |
|||
} |
|||
else |
|||
{ |
|||
LD_Oid_SDIO_LOW(); |
|||
} |
|||
delay_us(D_DELAY_10US); |
|||
LD_Oid_SCK_LOW(); |
|||
|
|||
#if 0 |
|||
if(i == 7) |
|||
{ |
|||
LD_Oid_SDIO_IN(); |
|||
} |
|||
#endif |
|||
delay_us(D_DELAY_10US); |
|||
Cmd <<= 1; |
|||
} |
|||
delay_us(D_DELAY_ROD_80US); |
|||
LD_Oid_SDIO_IN(); |
|||
} |
|||
|
|||
uint16_t L0_oid_RecvAck16(void) |
|||
{ |
|||
uint8_t i; |
|||
uint16_t AckValue; |
|||
AckValue = 0; |
|||
///
|
|||
LD_Oid_SDIO_OUT(); |
|||
delay_us(D_DELAY_10US); |
|||
LD_Oid_SCK_HIGH(); |
|||
LD_Oid_SDIO_LOW(); |
|||
delay_us(D_DELAY_10US); |
|||
LD_Oid_SCK_LOW(); |
|||
delay_us(D_DELAY_10US); |
|||
|
|||
for(i = 0; i < 16; i++) |
|||
{ |
|||
LD_Oid_SCK_HIGH(); |
|||
LD_Oid_SDIO_IN() |
|||
delay_us(D_DELAY_10US); |
|||
LD_Oid_SCK_LOW(); |
|||
if(OID_DET) |
|||
{ |
|||
AckValue +=1; |
|||
} |
|||
|
|||
if(i < 15) |
|||
{ |
|||
AckValue <<= 1; |
|||
} |
|||
|
|||
delay_us(D_DELAY_10US); |
|||
} |
|||
delay_us(D_DELAY_ROD_80US); |
|||
|
|||
return AckValue; |
|||
} |
|||
|
|||
|
|||
void L0_oid_Recv64(void) |
|||
{ |
|||
uint8_t i; |
|||
Lc_memset8bits(ts_oid.rec.d, 0, 8); |
|||
LD_Oid_SDIO_OUT(); |
|||
delay_us(D_DELAY_10US); |
|||
LD_Oid_SCK_HIGH(); |
|||
LD_Oid_SDIO_LOW(); |
|||
|
|||
delay_us(D_DELAY_10US); |
|||
LD_Oid_SCK_LOW(); |
|||
|
|||
delay_us(D_DELAY_10US); |
|||
LD_Oid_SDIO_IN() |
|||
|
|||
for(i = 0; i < 64; i++) |
|||
{ |
|||
LD_Oid_SCK_HIGH(); |
|||
delay_us(D_DELAY_10US); |
|||
LD_Oid_SCK_LOW(); |
|||
|
|||
|
|||
#if 0 |
|||
if(OID_DET) |
|||
{ |
|||
if(i < 32) |
|||
{ |
|||
RecvData[0] += 1; |
|||
} |
|||
if(i>=32 && i<64) |
|||
{ |
|||
RecvData[1] += 1; |
|||
} |
|||
|
|||
} |
|||
|
|||
if(i < 31) |
|||
{ |
|||
RecvData[0] <<= 1; |
|||
} |
|||
if( i >31 && i < 63) |
|||
{ |
|||
RecvData[1] <<= 1; |
|||
} |
|||
#endif |
|||
|
|||
///#else
|
|||
|
|||
ts_oid.rec.d[i/8] <<= 1; |
|||
|
|||
if(OID_DET) |
|||
{ |
|||
ts_oid.rec.d[i/8] |= 1; |
|||
// RecvData[1] += 1;
|
|||
} |
|||
else |
|||
{ |
|||
ts_oid.rec.d[i/8] &= 0xfe; |
|||
} |
|||
// RecvData[1] <<= 1;
|
|||
|
|||
|
|||
|
|||
delay_us(D_DELAY_10US); |
|||
} |
|||
|
|||
|
|||
ts_oid.time = D_sys_now; |
|||
delay_us(D_DELAY_ROD_80US); |
|||
|
|||
return; |
|||
} |
|||
|
|||
uint8_t L1_oid_TransCmd(uint8_t Cmd) |
|||
{ |
|||
uint8_t TxCmd;///,det_busy;
|
|||
uint32_t RxAckCnt = 0; |
|||
|
|||
// L0_uart0_sendstr("\r\n w cmd=");
|
|||
/// L0_uart0_uchex(Cmd);
|
|||
//
|
|||
while(!OID_DET) |
|||
{ |
|||
L0_oid_Recv64(); |
|||
L1_print_rcv("\r\n busy: RD="); |
|||
} |
|||
TxCmd = Cmd; |
|||
L0_oid_SendCmd(TxCmd); |
|||
LD_Oid_SCK_LOW(); |
|||
delay_us(10); |
|||
#define D_oid_waitrcv_delay 100000 |
|||
while(OID_DET) |
|||
{ |
|||
/// L1_oid_RecvOptData();
|
|||
RxAckCnt ++; |
|||
if(RxAckCnt > D_oid_waitrcv_delay) |
|||
{ |
|||
|
|||
L0_uart0_sendstr("\r\nno rec"); |
|||
L0_uart0_uchex(Cmd); |
|||
break; |
|||
} |
|||
} |
|||
|
|||
if(RxAckCnt <= D_oid_waitrcv_delay) |
|||
{ |
|||
TxCmd = (uint8_t)L0_oid_RecvAck16(); |
|||
TxCmd -= 1; |
|||
if(TxCmd == Cmd) |
|||
{ |
|||
|
|||
L0_uart0_sendstr("\r\nCmd="); |
|||
L0_uart0_uchex(Cmd);L0_uart0_uc('-'); |
|||
L0_uart0_uchex(TxCmd); |
|||
return 1; |
|||
} |
|||
} |
|||
} |
|||
|
|||
uint32_t L1_oidReadRegister (uint16_t Data1) |
|||
{ |
|||
uint8_t i,Ret; |
|||
uint32_t uxReturn; |
|||
|
|||
TransCmd[0] = 0x74; |
|||
TransCmd[1] = 3; |
|||
TransCmd[2] = Data1 >> 8; |
|||
TransCmd[3] = Data1 & 0x00FF; |
|||
TransCmd[4] = (TransCmd[1] + TransCmd[2] + TransCmd[3]) & 0xFF; |
|||
|
|||
for(i=0;i<5;i++) |
|||
{ |
|||
Ret = L1_oid_TransCmd(TransCmd[i]); |
|||
if(Ret == 0) |
|||
{ |
|||
return 0x5FFFFFFF; |
|||
} |
|||
} |
|||
|
|||
i = 0; |
|||
while(1) |
|||
{ |
|||
if(!OID_DET) |
|||
{ |
|||
L0_oid_Recv64(); |
|||
|
|||
/// uxReturn = RecvData[1];
|
|||
uxReturn = ts_oid.rec.d32[1]; |
|||
uxReturn &= 0xFFFF; |
|||
return uxReturn; |
|||
} |
|||
|
|||
delay_us(100); |
|||
i += 1; |
|||
if(i >= 20) // check 100ms
|
|||
{ |
|||
return 0x2FFFFFFF; |
|||
} |
|||
} |
|||
} |
|||
|
|||
/******************************************************************************************************
|
|||
Function: |
|||
Input: |
|||
Output: |
|||
*******************************************************************************************************/ |
|||
uint8_t Write_Register(uint16_t Data1,uint16_t Data2) |
|||
{ |
|||
uint8_t Ret,i; |
|||
uint16_t j; |
|||
Ret = 1; |
|||
|
|||
TransCmd[0] = 0X73; |
|||
TransCmd[1] = 0x05; |
|||
j = Data1>>8; |
|||
TransCmd[2] = (uint8_t)j; |
|||
j = Data1; |
|||
TransCmd[3] = (uint8_t)j; |
|||
j = Data2>>8; |
|||
TransCmd[4] = (uint8_t)j; |
|||
j = Data2; |
|||
TransCmd[5] = (uint8_t)j; |
|||
TransCmd[6] = (TransCmd[1] + TransCmd[2] + TransCmd[3] + TransCmd[4] + TransCmd[5]); |
|||
|
|||
for(i=0;i<7;i++) |
|||
{ |
|||
Ret = L1_oid_TransCmd(TransCmd[i]); |
|||
if(Ret == 0) |
|||
{ |
|||
break; |
|||
} |
|||
} |
|||
return Ret; |
|||
} |
|||
|
|||
void L1_print_rcv(char *str) |
|||
{ |
|||
L0_uart0_sendstr(str); |
|||
/********
|
|||
// Lc_delay_ms(1);
|
|||
L0_uart0_ulhex(RecvData[0]); |
|||
// Lc_delay_ms(1);
|
|||
L0_uart0_uc(0x09); |
|||
L0_uart0_ulhex(RecvData[1]); |
|||
|
|||
L0_uart0_uc(0x09); |
|||
**********/ |
|||
|
|||
/// L0_uart0_ulhex(ts_oid.rec.d32[1]);L0_uart0_uc(0x09);
|
|||
///
|
|||
|
|||
// L0_uart0_sendArrayHex(ts_oid.rec.d,8);
|
|||
///L2_oid_ParseF1();
|
|||
|
|||
} |
|||
/******************************************************************************************************
|
|||
Function: |
|||
Input: |
|||
Output: |
|||
|
|||
BYTE0 BYTE1 BYTE2 BYTE3 BYTE4 BYTE5 BYTE6 BYTE7 |
|||
666655555555554444444444333333333322222222221111111111 |
|||
3210987654321098765432109876543210987654321098765432109876543210 |
|||
76543210 76543210 76543210 76543210 |
|||
76543210 76543210 76543210 76543210 |
|||
BYTE0 BYTE1 BYTE2 BYTE3 BYTE4 BYTE5 BYTE6 BYTE7 |
|||
|
|||
|
|||
U16[0] U16[1] U16[2] U16[3] |
|||
111111 111111 111111 111111 |
|||
5432109876543210543210987654321054321098765432105432109876543210 |
|||
666655555555554444444444333333333322222222221111111111 |
|||
3210987654321098765432109876543210987654321098765432109876543210 |
|||
|
|||
u32[0] u32[1] |
|||
3322222222221111111111 3322222222221111111111 |
|||
1098765432109876543210987654321010987654321098765432109876543210 |
|||
666655555555554444444444333333333322222222221111111111 |
|||
3210987654321098765432109876543210987654321098765432109876543210 |
|||
|
|||
U16 angle; // 53–45 Angle 53,52 51 50 49,48 47 46 45
|
|||
U8 Ydec; //小数部分43–36 1111 0010b (Y decimal)
|
|||
U8 Xdec; //小数部分35–28 0111 0100b (X decimal)
|
|||
U8 Yint; //整数部分 27–14 00 0000 0000 0100b (Y integer)
|
|||
U8 Xint; //整数部分 13–0 00 0000 0000 0100b (X integer)
|
|||
|
|||
*******************************************************************************************************/ |
|||
vU16 Lc_dec_us100(vU16 pint,u8 pdec) |
|||
{ |
|||
pint *= 100; |
|||
if(pdec&0x80)///负数
|
|||
{ |
|||
pdec &= 0x7f; |
|||
pint -= 100; |
|||
}else |
|||
{ |
|||
|
|||
} |
|||
pdec *= 100; |
|||
pdec /= 128; |
|||
pint += (vU16)pdec; |
|||
return pint; |
|||
|
|||
} |
|||
|
|||
void L2_oid_ParseF1(void) |
|||
{ |
|||
/// static uint8_t ucLogNum = 0;
|
|||
uint16_t u16i = 0; |
|||
uint32_t u32t[2] = 0; |
|||
/// L1_print_rcv("\r\n F1=");
|
|||
ts_oid.oid_type = ts_oid.rec.d[0]; |
|||
if(ts_oid.rec.d[0] == 0x60) |
|||
{/// Bit43~Bit0:x,y 轴的坐标数据,x 坐标和 y 坐标都是由整数和小数部分
|
|||
///组成,整数部分 14bit,小数部分 8bit
|
|||
G.pen_t = 0; |
|||
ts_oid.last_time = s_nos_tick.t_1s; |
|||
ts_oid.Xint = ts_oid.rec.d16[3]&0x3fff; |
|||
if(ts_oid.Xint < 300)///取决于图片 fixme: cc
|
|||
{ |
|||
ts_oid.oid_x = 1; |
|||
|
|||
u32t[0] = ts_oid.rec.d32[0]; |
|||
u32t[1] = ts_oid.rec.d32[1]; |
|||
|
|||
ts_oid.angle = (vU16)(u32t[0]>>13); //45-32= 13
|
|||
ts_oid.angle &= 0x01ff; //53-45+1=8
|
|||
///36-43
|
|||
ts_oid.Ydec = (ts_oid.rec.d[2]<<4) | (ts_oid.rec.d[3]>>4); |
|||
///28 35
|
|||
ts_oid.Xdec = (ts_oid.rec.d[3]<<4) | (ts_oid.rec.d[4]>>4); |
|||
#ifdef docsdfads |
|||
C0EC58E5 60 4D 24 23 A0 23 80 57 (12800.4500,142.5156) 105 |
|||
C0EC58E5 60 4C E4 54 C0 23 40 5A (12800.5900,141.5391) 103 |
|||
C0EC58E5 60 4D 44 B5 A0 23 00 5D (12800.7000,140.5859) 106 |
|||
C0EC58E5 60 4D 24 AF 30 22 C0 61 (12800.9000,139.5781) 105 |
|||
C0EC58E5 60 4D 24 B1 E0 22 80 64 (12800.2300,138.5859) 105 |
|||
|
|||
A0 23 80 57 (12800.4500,142.5156) 105 |
|||
A0 23 80 57 |
|||
C0 23 40 5A |
|||
A0 23 00 5D |
|||
30 22 C0 61 |
|||
E0 22 80 64 |
|||
1010 0000 0010 0011 1000 0000 0101 0111 |
|||
3322 2222 2222 1111 1111 11 |
|||
1098 7654 3210 9876 5432 1098 7654 3210 |
|||
|
|||
#endif |
|||
u32t[1] >>= 14; |
|||
ts_oid.Yint = (vU16)u32t[1]; |
|||
ts_oid.Yint &= 0x3fff; |
|||
|
|||
|
|||
|
|||
#if 0 |
|||
if(ts_oid.Xdec&0x80) |
|||
{ |
|||
ts_oid.x -= 1.0; |
|||
} |
|||
|
|||
|
|||
|
|||
ts_oid.Xdec&=0x7f; |
|||
ts_oid.x = (float)ts_oid.Xdec; |
|||
ts_oid.x /= 128.0; |
|||
if(ts_oid.Xdec&0x80) |
|||
{ |
|||
ts_oid.x -= 1.0; |
|||
} |
|||
ts_oid.x += ts_oid.Xint; |
|||
|
|||
ts_oid.Ydec&=0x7f; |
|||
ts_oid.y = (float)ts_oid.Ydec; |
|||
ts_oid.y /= 128.0; |
|||
if(ts_oid.Ydec&0x80) |
|||
{ |
|||
ts_oid.y -= 1.0; |
|||
} |
|||
ts_oid.y += ts_oid.Yint; |
|||
|
|||
#else |
|||
ts_oid.X100 = Lc_dec_us100(ts_oid.Xint,ts_oid.Xdec); |
|||
ts_oid.Y100 = Lc_dec_us100(ts_oid.Yint,ts_oid.Ydec); |
|||
|
|||
|
|||
#endif |
|||
|
|||
//数据存储到寄存器
|
|||
|
|||
printf(" %hd %hd %hd ", |
|||
ts_oid.X100,ts_oid.Y100, |
|||
ts_oid.angle); |
|||
} |
|||
else |
|||
{ |
|||
ts_oid.oid_type = 0; |
|||
L0_uart0_uc(';'); |
|||
} |
|||
} |
|||
else if(ts_oid.rec.d[0] == 0x40)///手写
|
|||
{ |
|||
//// 普通码(bit61=0)
|
|||
//// Bit60:码是否有效(1:无效码;0:有效码)
|
|||
//// Bit59~Bit28:保留
|
|||
/// Bit27~Bit0:有效数据
|
|||
/// G.oid_p = 1;
|
|||
ts_oid.oid_p = 1; |
|||
ts_oid.gCode = ts_oid.rec.d32[1]&0x0fFFffFF; |
|||
|
|||
///R.oid3_order = (int)ts_oid.gCode *100;
|
|||
|
|||
|
|||
|
|||
printf(" %ld %x ",ts_oid.gCode,(int)ts_oid.gCode); |
|||
|
|||
L0_uart0_ulhex(ts_oid.gCode); |
|||
}else |
|||
{ |
|||
ts_oid.oid_type = 0; |
|||
L0_uart0_uc(','); |
|||
} |
|||
} |
|||
void L2_oid_status(void) |
|||
{ |
|||
if(G.oid_x) |
|||
{ |
|||
if(ts_oid.pre_x == 0 && ts_oid.pre_y == 0&& ts_oid.X100 != 0 &&ts_oid.Y100 != 0) |
|||
{ |
|||
G.pen_down = 1; |
|||
//L0_uart2_sendstr("123");
|
|||
} |
|||
else if(ts_oid.pre_x != 0 && ts_oid.pre_y != 0&& ts_oid.X100 != 0 &&ts_oid.Y100 != 0) |
|||
{ |
|||
G.pen_hold = 1; |
|||
//L0_uart2_sendstr("456");
|
|||
} |
|||
} |
|||
|
|||
} |
|||
|
|||
uint8_t L1_OID_WakeUp(void) |
|||
{ |
|||
uint32_t i = 0; |
|||
LD_Oid_SCK_LOW(); |
|||
delay_ms(2); |
|||
LD_Oid_SCK_HIGH(); |
|||
delay_ms(30); |
|||
LD_Oid_SCK_LOW(); |
|||
|
|||
L0_uart0_sendstr(" 44 "); |
|||
|
|||
while(1) |
|||
{ |
|||
delay_ms(10); |
|||
i += 1; |
|||
if(i >= 400) // 400*5ms = 2s
|
|||
{ |
|||
L0_uart0_sendstr(" !!out!! "); |
|||
return 0; |
|||
} |
|||
if(!OID_DET) |
|||
{ |
|||
L0_oid_Recv64(); |
|||
L1_print_rcv("\r\n WakeUpOID get="); |
|||
if(ts_oid.rec.d[7] == 0xf8) |
|||
{ |
|||
///use
|
|||
L0_uart0_sendstr(" ok\r\n"); |
|||
return 1;//ucCheckVersionAndInit(eAppDevice);
|
|||
|
|||
} |
|||
else |
|||
{ |
|||
L0_uart0_sendstr("\r\nno?? OIDCMD_POWER_ON \r\n"); |
|||
return 0; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
|
|||
/******************************************************************************************************
|
|||
Function: |
|||
Input: |
|||
Output: |
|||
*******************************************************************************************************/ |
|||
void L0_Oid_Init(void) |
|||
{ |
|||
LD_Oid_DIO_INIT(); |
|||
/******************************************************************************************************
|
|||
5430C2000A/3000A点读应用初始化设置 |
|||
顺序 命令设置 备注 |
|||
1 single command 0x4D 关闭解码 |
|||
2 REG(0xD40) = 0x00 设置仅读OID码,0X00仅读OID3/OID2,0X10仅读OID3S,0X20仅读OID4 |
|||
3 single command 0x36 关闭手写码侦测 |
|||
4 "REG(0x0DAD) = 4250 //设置AE Target |
|||
REG(0x0DB1) = 4000 //设置AE LOW
|
|||
REG(0x0DAF) = 4000 //设置AE LOW
|
|||
REG(0x0DB0) = 4500 //设置AE HIGH
|
|||
REG(0x0DAE) = 4500 //设置AE HIGH
|
|||
|
|||
REG(0x1641) = 0xA0 //设置dot filter
|
|||
REG(0x0D6A) = 0x3F //此项不要改动
|
|||
REG(0x0D2C) = 0x3F //此项不要改动" "初始化,可不下此部分命令,若笔头配合底码识别不佳,可以下此部分命令,设置不同参数尝试。
|
|||
|
|||
设置AE Range和dot filter。 |
|||
AE_LOW < AE_Target <AE_HIGH. |
|||
Dot filter,要设置整数倍,比如0x40,0x50,0x60……。" |
|||
5 …… 用户命令,用户根据产品应用决定需要下的命令。 |
|||
6 REG(0xD63) = 0x80 打开解码。此命令错误改为如下命令。 |
|||
6 "i = REG(0xD63) |
|||
i &= 0xFFFE |
|||
REG(0xD63) = i" 打开解码,方法是把寄存器0xD63中的数据的bit0清零,其它bit不可动。 |
|||
|
|||
*******************************************************************************************************/ |
|||
L0_uart0_sendstr("\r\nL1_OID_WakeUp3 "); |
|||
L1_OID_WakeUp(); |
|||
L0_uart0_sendstr("666666"); |
|||
/***
|
|||
|
|||
L1_oid_TransCmd(0x4D);//// 1 single command 0x4D 关闭解码
|
|||
|
|||
Write_Register(0x0D40,0x00); //// 2 REG(0xD40) = 0x00 设置仅读OID码,0X00仅读OID3/OID2,0X10仅读OID3S,0X20仅读OID4
|
|||
|
|||
L1_oid_TransCmd(0x36);///3 single command 0x36 关闭手写码侦测
|
|||
Write_Register(0x0DAD,4250); //设置 AE Target 4 "REG(0x0DAD) = 4250 //设置AE Target
|
|||
Write_Register(0x0DB1,4000); //设置 AE LOW
|
|||
Write_Register(0x0DAF,4000); //设置 AE LOW
|
|||
Write_Register(0x0DB0,4500); //设置 AE High
|
|||
Write_Register(0x0DAE,4500); //设置 AE High 0x1194
|
|||
Write_Register(0x1641,0xA0); //设置 dot filter
|
|||
Write_Register(0x0D6A,0x3F); //此项不要改动
|
|||
Write_Register(0x0D2C,0x3F); //此项不要改动" "初始化,可不下此部分命令,若笔头配合底码识别不佳,可以下此部分命令,设置不同参数尝试。
|
|||
******/ |
|||
|
|||
Write_Register(0x0D63,0x80); //cc 好像数据分辨率有区别 此项不要改动 6 REG(0xD63) = 0x80 打开解码。此命令错误改为如下命令。
|
|||
|
|||
///L1_oid_CheckVersionAndInit();///cc 仍然有读取错误的时候
|
|||
|
|||
// 6 "i = REG(0xD63)
|
|||
// i &= 0xFFFE
|
|||
// REG(0xD63) = i" 打开解码,方法是把寄存器0xD63中的数据的bit0清零,其它bit不可动。
|
|||
L1_oid_TransCmd(USERCMD_20FPS);//cc 必须添加
|
|||
L1_oid_TransCmd(USERCMD_EN_ANGLE);//cc 必须添加
|
|||
L1_oid_TransCmd(USERCMD_EN_POSITION);//cc 必须添加
|
|||
|
|||
|
|||
printf("\r\n L0_Oid_Init finish\r\n"); |
|||
|
|||
///while(9)
|
|||
{ |
|||
L1_Oid_readoid(); |
|||
|
|||
} |
|||
|
|||
} |
|||
|
|||
void L1_Oid_readoid(void) |
|||
{ |
|||
if(!OID_DET) |
|||
{ |
|||
|
|||
ts_oid.pre_x = ts_oid.X100; |
|||
ts_oid.pre_y = ts_oid.Y100; |
|||
L0_oid_Recv64(); |
|||
L2_oid_ParseF1(); |
|||
//L2_oid_status();
|
|||
L1_print_rcv("\r\n "); |
|||
} |
|||
else if((s_nos_tick.t_1s - ts_oid.last_time >= 2)&& (G.pen_t == 0)) |
|||
{ |
|||
G.pen_up = 1; |
|||
G.pen_t =1; |
|||
//L0_uart2_sendstr("789");
|
|||
} |
|||
/// delay_us(100);
|
|||
} |
|||
|
|||
|
|||
#if 0 |
|||
|
|||
step1 |
|||
if(!OID_DET) |
|||
{ |
|||
L0_oid_Recv64(); |
|||
|
|||
step2 |
|||
|
|||
L2_oid_ParseF1(); |
|||
step 3 |
|||
状态 |
|||
|
|||
|
|||
|
|||
///#ifdef doc980808
|
|||
验证算法的正确性 |
|||
unsigned char s[64]= |
|||
{ |
|||
|
|||
1 , // 0
|
|||
1 , // 1
|
|||
1 , // 2
|
|||
1 , // 3
|
|||
1 , // 4
|
|||
1 , // 5
|
|||
1 , // 6
|
|||
1 , // 7 xxxx
|
|||
|
|||
1 , // 8
|
|||
1 , // 9
|
|||
1 , // 10
|
|||
1 , // 11
|
|||
1 , // 12
|
|||
1 , // 13
|
|||
1 , // 14
|
|||
1 , // 15 xxxx
|
|||
|
|||
1 , // 16
|
|||
1 , // 17
|
|||
1 , // 18
|
|||
1 , // 19
|
|||
1 , // 20
|
|||
1 , // 21
|
|||
1 , // 22
|
|||
1 , // 23 xxxx
|
|||
|
|||
1 , // 24
|
|||
1 , // 25
|
|||
1 , // 26
|
|||
1 , // 27
|
|||
1 , // 28
|
|||
1 , // 29
|
|||
1 , // 30
|
|||
1 , // 31 xxxx
|
|||
|
|||
1 , // 32
|
|||
1 , // 33
|
|||
1 , // 34
|
|||
1 , // 35
|
|||
1 , // 36
|
|||
1 , // 37
|
|||
1 , // 38
|
|||
1 , // 39 xxxx
|
|||
|
|||
1 , // 40
|
|||
1 , // 41
|
|||
1 , // 42
|
|||
1 , // 43
|
|||
1 , // 44
|
|||
1 , // 45
|
|||
1 , // 46
|
|||
1 , // 47 xxxx
|
|||
|
|||
1 , // 48
|
|||
1 , // 49
|
|||
1 , // 50
|
|||
1 , // 51
|
|||
1 , // 52
|
|||
1 , // 53
|
|||
1 , // 54
|
|||
1 , // 55 xxxx
|
|||
|
|||
1 , // 56
|
|||
1 , // 57
|
|||
1 , // 58
|
|||
1 , // 59
|
|||
1 , // 60
|
|||
1 , // 61
|
|||
1 , // 62
|
|||
1 // 63 xxxx
|
|||
|
|||
}; |
|||
int x =0; |
|||
int i; |
|||
|
|||
|
|||
void t(void) |
|||
{RecvData[0] = 0;RecvData[1] = 0; |
|||
for(i = 0; i < 64; i++) |
|||
{ |
|||
|
|||
|
|||
if(s[63-i]) |
|||
{ |
|||
if(i < 32) |
|||
{ |
|||
RecvData[0] += 1; |
|||
} |
|||
if(i>=32 && i<64) |
|||
{ |
|||
RecvData[1] += 1; |
|||
} |
|||
|
|||
} |
|||
if(i < 31) |
|||
{ |
|||
RecvData[0] <<= 1; |
|||
} |
|||
if( i >31 && i < 63) |
|||
{ |
|||
RecvData[1] <<= 1; |
|||
} |
|||
|
|||
|
|||
} |
|||
|
|||
for(i = 0; i < 64; i++) |
|||
{ |
|||
ts_oid.d[i/8] <<= 1; |
|||
if(s[63-i]) |
|||
{ |
|||
ts_oid.d[i/8] |= 1; |
|||
} |
|||
else |
|||
{ |
|||
ts_oid.d[i/8] &= 0xfe; |
|||
} |
|||
} |
|||
i =5; |
|||
|
|||
} |
|||
|
|||
|
|||
#endif |
|||
|
@ -0,0 +1,183 @@ |
|||
#ifndef __OPTICALDATA__ |
|||
#define __OPTICALDATA__ |
|||
|
|||
#include "bsp_config.h" |
|||
#include "../app/app_config.h" |
|||
|
|||
/******************************************************************************************************
|
|||
配置参数 |
|||
*******************************************************************************************************/ |
|||
#define ROM009_HANDWRITE 0 |
|||
#define DATA_FORMAT_2 0 |
|||
#define OID_4C 0 |
|||
#define DEBOUNCE_FUNC 0 |
|||
#define LOG_REGISTER 0 |
|||
|
|||
#if DEBOUNCE_FUNC |
|||
#define DEBOUNCE_TIMES 3 // 连续三笔相同,才触发,debounce时,可设置。去抖动时间
|
|||
#define DEBOUNCE_RELESE_TIME 20 //5ms * 20 = 100ms,100ms无任何码,认为抬笔。
|
|||
#endif |
|||
/******************************************************************************************************
|
|||
2-wire GPIO |
|||
|
|||
#define D_stdIO_P5(n) BITN_0(P5M1,n);BITN_0(P5M0,n); //////00 准双向口 灌电流20mA 拉电流270-150uS
|
|||
#define D_HighI_P5(n) BITN_0(P5M1,n);BITN_1(P5M0,n); //////01 推挽输出 20mA 加限流
|
|||
#define D_HighR_P5(n) BITN_1(P5M1,n);BITN_0(P5M0,n); /////////10 高阻
|
|||
#define D_OpenD_P5(n) BITN_1(P5M1,n);BITN_1(P5M0,n); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
|
|||
*******************************************************************************************************/ |
|||
#define LD_oid_io_init() LD_Oid_SCK_INIT() |
|||
////#define LD_Oid_SCK_INIT() D_stdIO_P3(BITN4);
|
|||
|
|||
#define LD_Oid_SCK_LOW() D_P34_OFF(); |
|||
#define LD_Oid_SCK_HIGH() D_P34_ON(); |
|||
|
|||
#define LD_Oid_SCK_INIT(); D_HighI_P3(BITN4);LD_Oid_SCK_LOW(); |
|||
|
|||
|
|||
#define LD_Oid_SDIO_INIT() D_HighR_P5(BITN0) |
|||
#define LD_Oid_SDIO_LOW() D_P50_OFF() |
|||
#define LD_Oid_SDIO_HIGH() D_P50_ON() |
|||
#define LD_Oid_SDIO_IN() D_HighR_P5(BITN0)//高阻输入
|
|||
#define LD_Oid_SDIO_OUT() D_HighI_P5(BITN0)//推挽输出
|
|||
|
|||
#define LD_Oid_SDIO_AT() D_P50_AT() |
|||
|
|||
|
|||
#define LD_Oid_DIO_INIT(); LD_Oid_SCK_INIT();LD_Oid_SDIO_INIT(); |
|||
|
|||
|
|||
#define OID_DET P50 |
|||
|
|||
/******************************************************************************************************
|
|||
OID命令 |
|||
*******************************************************************************************************/ |
|||
|
|||
|
|||
////20211229依据53xx和54xx系列操作
|
|||
#define USERCMD_20FPS 0x24 |
|||
#define USERCMD_30FPS 0x25 |
|||
#define USERCMD_40FPS 0x26 |
|||
#define USERCMD_50FPS 0x27 |
|||
#define USERCMD_80FPS 0x3C |
|||
#define USERCMD_80FPS_EXIT 0x3B |
|||
#define USERCMD_DECODE_SHUT 0x4D |
|||
#define USERCMD_LIANCHUAN 0x40 |
|||
#define USERCMD_SUSPEND 0x57 |
|||
#define USERCMD_EN_ANGLE 0x10 |
|||
#define USERCMD_EN_POSITION 0x35 |
|||
#define USERCMD_SW_POSITION 0x43 |
|||
#define USERCMD_DATA_FORMAT_2 0x2C |
|||
#define USERCMD_LOU_GUANG 0xD7 |
|||
#define USERCMD_POWER_DOWN 0x56 |
|||
|
|||
|
|||
|
|||
#define OIDCMD_POWER_ON 0x0000FFF8 |
|||
#define OIDCMD_POWER_OFF 0x0000FFF7 |
|||
/******************************************************************************************************
|
|||
OID版本 |
|||
*******************************************************************************************************/ |
|||
#define OID_VER_D 0x1169 |
|||
#define OID_VER_REG 0x1670 |
|||
#define OID_VER_F 0x1168 |
|||
#define REG_READOID_SET 0xD40 |
|||
#define REG_EN_DECODE 0xD63 |
|||
#define REG_ROM008 0xDA5 |
|||
#define REG_ROM009 0xDA6 |
|||
#define ROM_009 0x09 |
|||
#define ROM_008 0x00 |
|||
/******************************************************************************************************
|
|||
Dataformat 2定义 |
|||
*******************************************************************************************************/ |
|||
#define CHECK_INVALID_DF2 0x40000000 |
|||
#define CHECK_OID_VERSION_DF2 0xFC000000 |
|||
#define OID_2_GENERAL_DF2 0x00000000 |
|||
#define OID_3_GENERAL_DF2 0x08000000 |
|||
#define OID_3_POSITION_DF2 0x04000000 |
|||
#define OID_3S_GENERAL_DF2 0x10000000 |
|||
#define OID_3S_POSITION_DF2 0x0C000000 |
|||
#define OID_35_GENERAL_DF2 0x14000000 |
|||
#define OID_4_GENERAL_DF2 0x1C000000 |
|||
#define OID_4_POSITION_DF2 0x18000000 |
|||
#define OID_4C_POSITION_DF2 0x20000000 |
|||
/******************************************************************************************************
|
|||
函数声明 |
|||
*******************************************************************************************************/ |
|||
typedef enum |
|||
{ |
|||
eHandWrite = 0, |
|||
ePointRead_2000A = 1, |
|||
ePointRead_3000A = 2, |
|||
ePointRead_LightGuide = 3, |
|||
eCar_LightGuide = 4, |
|||
}AppDevice; |
|||
extern AppDevice eAppDevice; |
|||
/*****************
|
|||
|
|||
void OidTaskLoop(void); |
|||
uint8_t L1_oid_TransCmd(uint8_t Cmd); |
|||
uint8_t WakeUpOID(void); |
|||
|
|||
|
|||
void L1_oid_RecvOptData(void); |
|||
|
|||
void LogRegister(void); |
|||
uint8_t L1_oid_CheckVersionAndInit(AppDevice eAppDevice); |
|||
|
|||
/*****************************/ |
|||
/**********************************************************
|
|||
Bit Indication |
|||
63–60 0110b |
|||
59–54 Reserved |
|||
53–45 Angle |
|||
44 Reserved |
|||
43–36 1111 0010b (Y decimal) |
|||
35–28 0111 0100b (X decimal) |
|||
27–14 00 0000 0000 0100b (Y integer) |
|||
13–0 00 0000 0000 0100b (X integer) 变量定义 |
|||
******************************************************/ |
|||
|
|||
|
|||
|
|||
typedef struct _ts_OID |
|||
{//8byte
|
|||
/// u8 d[8];
|
|||
U_U64 rec; |
|||
U8 oid_type; //类型63–60 0110b
|
|||
U16 angle; // 53–45 Angle 53,52 51 50 49,48 47 46 45
|
|||
U8 Ydec; //小数部分43–36 1111 0010b (Y decimal)
|
|||
U8 Xdec; //小数部分35–28 0111 0100b (X decimal)
|
|||
vU16 Yint; //整数部分 27–14 00 0000 0000 0100b (Y integer)
|
|||
vU16 Xint; //整数部分 13–0 00 0000 0000 0100b (X integer)
|
|||
|
|||
vU16 Y100,X100;///放大100倍的输出
|
|||
vU32 gCode; //
|
|||
|
|||
vU32 time; |
|||
vU32 last_time; |
|||
|
|||
vU32 overtime; |
|||
|
|||
|
|||
float x,y;//cut
|
|||
vU16 pre_x,pre_y;//cut
|
|||
U8 oid_x; |
|||
U8 oid_p; |
|||
|
|||
|
|||
}Ts_OID_; |
|||
extern Ts_OID_ ts_oid; |
|||
///extern volatile uint32_t RecvData[3];
|
|||
|
|||
void L0_Oid_Init(void); |
|||
|
|||
uint8_t L1_oid_TransCmd(uint8_t Cmd); |
|||
void L1_print_rcv(char *str); |
|||
uint32_t L1_oidReadRegister (uint16_t Data1); |
|||
void L1_Oid_readoid(void); |
|||
uint8_t L1_OID_WakeUp(void); |
|||
void L2_oid_ParseF1(void); |
|||
void L0_oid_Recv64(void); |
|||
|
|||
#endif // __OPTICALDATA__
|
|||
|
@ -0,0 +1,240 @@ |
|||
////////////////////////////////////////////////////////////////////////////
|
|||
///@copyright Copyright (c) 2017, 传控科技 All rights reserved.
|
|||
///-------------------------------------------------------------------------
|
|||
/// @file bsp_config.h
|
|||
/// @brief hard config include
|
|||
/// @info FILE FOR HARDWARE SETUP AND SOFTWARE SETUP///FOR EXAMPLE: BAORD ,MCU,IDE
|
|||
/// @info YOU CAN CHANGE OR ADD THE DEFINE IF YOU NEED
|
|||
/// @info 整个嵌入式项目的入口 首先是确认电路板 然后确认cpu 芯片型号 然后确认编译器 之后是软件框架 最后是应用程序
|
|||
/// @info bsp_CONFIG 为其他头文件的始祖 TYPE_BOARD_xx
|
|||
///-------------------------------------------------------------------------
|
|||
/// @version 1.1
|
|||
/// @author CC
|
|||
/// @date 20180308
|
|||
/// @note
|
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
/// @version 5.1
|
|||
/// @author CC
|
|||
/// @date 20200301
|
|||
/// @note
|
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
|
|||
|
|||
//////////////////////////////////////////////////////////////////////////
|
|||
///存储器中的特殊参数
|
|||
///全球唯一ID号 7FF9H~7FFFH BFF9H~BFFFH EFF9H~EFFFH FDF9H~FDFFH 7字节
|
|||
///内部1.19V参考信号源 7FF7H~7FF8H BFF7H~BFF8H EFF7H~EFF8H FDF7H~FDF8H 毫伏(高字节在前)
|
|||
///32K掉电唤醒定时器的频率 7FF5H~7FF6H BFF5H~BFF6H EFF5H~EFF6H FDF5H~FDF6H Hz (高字节在前)
|
|||
///22.1184MHz的IRC参数(20M频段) 7FF4H BFF4H EFF4H FDF4H -
|
|||
///24MHz的IRC参数(20M频段) 7FF3H BFF3H EFF3H FDF3H -
|
|||
///20MHz的IRC参数(20M频段) 7FF2H BFF2H EFF2H FDF2H
|
|||
///固件版本为7.3.12U
|
|||
///以及后续版本有效
|
|||
///27MHz的IRC参数(35M频段) 7FF1H BFF1H EFF1H FDF1H
|
|||
///30MHz的IRC参数(35M频段) 7FF0H BFF0H EFF0H FDF0H
|
|||
///33.1776MHz的IRC参数(35M频段) 7FEFH BFEFH EFEFH FDEFH
|
|||
///35MHz的IRC参数(35M频段) 7FEEH BFEEH EFEEH FDEEH
|
|||
///36.864MHz的IRC参数(35M频段) 7FEDH BFEDH EFEDH FDEDH
|
|||
///保留 7FECH BFECH EFECH FDECH
|
|||
///保留 7FEBH BFEBH EFEBH FDEBH
|
|||
///20M频段的VRTRIM参数 7FEAH BFEAH EFEAH FDEAH
|
|||
///35M频段的VRTRIM参数 7FE9H BFE9H EFE9H FDE9H
|
|||
//////////////////////////////////////////////////////////////////////////
|
|||
|
|||
#ifndef _BSP_CONFIG_H |
|||
#define _BSP_CONFIG_H |
|||
|
|||
#include <INTRINS.H> |
|||
#include "../bsp/bsp_config_const.h" |
|||
#include "../clib/type.h" |
|||
#include "../clib/bit.h" |
|||
|
|||
|
|||
//STEP 1 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TYPE_UASER_BOARD SELECT
|
|||
#define TYPE_UASER_BOARD TYPE_BOARD_TOUCH_PEN_0B |
|||
//STEP 1 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<YPE_UASER_BOARD SELECT End
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
//STEP 2 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TYPE_UASER_BOARD CONFIG
|
|||
#if(TYPE_UASER_BOARD == TYPE_BOARD_TOUCH_PEN_0B) |
|||
#include <intrins.h> |
|||
#include "../cpu/stc_stc8hxx.h" |
|||
#include "../cpu/stc_macro.h" |
|||
|
|||
//基本配置(工作频率、时钟、看门狗、字节序)
|
|||
#define TYPE_MCU TYPE_MCU_STC_8H |
|||
#define TYPE_IDE TYPE_IDE_KEIL |
|||
#define D_CPUfamily_type D_CPUfamily_8bits |
|||
#define D_sys_MainFre MainFre_22M |
|||
#define D_sys_Jiffies TYPE_JIFFIES_10MS |
|||
#define D_WDT_STATUS TYPE_WDT_DISABLE //如果配置为enable,请在bsp_config.c中设置wdt溢出时间
|
|||
#define D_MCU_ENDIAN TYPE_MCU_BIGENDIAN |
|||
#define D_CODE_ENCRYPTION_TYPE TYPE_ENCRYPTION_ENABLE //是否代码加密
|
|||
|
|||
|
|||
#define D_MCU_NAME "STC8H3K64S4" |
|||
//存储器特殊参数地址配置
|
|||
#define D_MCU_SPEC_PARAM_CHIPID 0xFDF9 |
|||
//...其他参数
|
|||
|
|||
//串口配置
|
|||
#define D_uart0_BRT BRT_115200 |
|||
#define D_uart0_SBIT SBIT_1 |
|||
#define D_PIN_UART0 PIN_UART0_Rxd_30_Txd_31 |
|||
#define D_uart2_BRT BRT_115200 |
|||
#define D_uart2_SBIT SBIT_1 |
|||
#define D_PIN_UART2 PIN_UART2_Rxd_10_Txd_11 //wifi模块
|
|||
#define D_uart3_BRT BRT_115200 |
|||
#define D_PIN_UART3 PIN_UART3_Rxd_43_Txd_44 //声音模块
|
|||
#define D_uart4_BRT BRT_115200 |
|||
|
|||
//485配置
|
|||
#define D_UART0_485_TYPE TYPE_485_NONE //UART0启用485
|
|||
#define D_UART0_485_SLAVER_ID_BROADCAST 0xFF //485从机总是响应0xFF消息
|
|||
#define D_UART0_485_SLAVER_ID 0x01 //板卡作为485从机 slaverId
|
|||
#define D_UART0_485_TX() P32 = 1; |
|||
#define D_UART0_485_RX() P32 = 0; |
|||
#define D_UART2_485_TYPE TYPE_485_NONE //UART2不启用485
|
|||
#define D_UART3_485_TYPE TYPE_485_NONE //UART2不启用485
|
|||
#define D_UART4_485_TYPE TYPE_485_NONE //UART2不启用485
|
|||
|
|||
//MODBUS协议配置
|
|||
#define D_MODBUS_ENABLE //MODBS启用开关,如果不使用modbus,可以注释掉本行
|
|||
#define D_MODBUS_SPLIT_ENTRY L1_modbus_split //modbus切割函数,在tpc_modbus.c中实现,依据实际情况修改
|
|||
#define D_MODBUS_REG_MAX_NUM 32 //每次最多读取/写入的寄存器数量,此处的数量要注意和 D_tp_handle_x_len 对应
|
|||
|
|||
//外设定义
|
|||
|
|||
#define LED1 P27 //D4
|
|||
#define LED2 P26 //D4
|
|||
#define LED3 P2 //D4
|
|||
#define LED4 P55 //D4
|
|||
//笔头
|
|||
#define SCK P34 |
|||
#define SDIO P50 |
|||
//按键
|
|||
#define key1 P32 |
|||
#define key2 P33 |
|||
#define key3 P40 |
|||
//EEP存储地址定义
|
|||
#define D_EEP_SECTOR_SIZE 0x200 //每个扇区0x200==512bytes
|
|||
#define D_EEP_SECTOR_BLOCK_SIZE 0x40 //扇区中每个数据块0x40==64bytes,可选值[32,64,128]等
|
|||
#define D_EEP_SECTOR_BLOCK_NUM (D_EEP_SECTOR_SIZE / D_EEP_PARAM_BLOCK_SIZE) //每个扇区数据块的数量
|
|||
#define D_EEP_BLOCK_FILTER0 0xAA //扇区中每个数据块的Filter字段值
|
|||
#define D_EEP_BLOCK_FILTER1 0x55 |
|||
//EEP User Defined 参数区存储配置
|
|||
#define D_EEP_PARAM_IN_SECTOR 1 //eeprom参数区扇区地址,从0开始
|
|||
#define D_EEP_PARAM_IN_BLOCK 0 //eeprom参数区数据块地址,从0开始
|
|||
//#define D_EEP_PARAM_BLOCK_SIZE (D_EEP_SECTOR_BLOCK_SIZE) //参数区每个块大小,必须:D_EEP_PARAM_BLOCK_SIZE<=D_EEP_SECTOR_BLOCK_SIZE!!!,因为eeprom.h中是按照D_EEP_SECTOR_BLOCK_SIZE分配的buf
|
|||
//#define D_EEP_PARAM_BLOCK_NUM (D_EEP_SECTOR_SIZE / D_EEP_PARAM_BLOCK_SIZE) //每个扇区数据块的数量
|
|||
//EEP 加密区存储配置
|
|||
#if(D_CODE_ENCRYPTION_TYPE == TYPE_ENCRYPTION_ENABLE) |
|||
#define D_EEP_ENC_IN_SECTOR 0 //eeprom加密区扇区地址,从0开始
|
|||
#define D_EEP_ENC_IN_BLOCK 0 //eeprom加密区数据块地址,从0开始
|
|||
//#define D_EEP_ENC_BLOCK_SIZE 0x20 //ENC_BLOCK_SIZE必须与加密程序中的ENC_BLOCK_SIZE匹配,此处不建议修改,如需修改,请同时修改加密程序
|
|||
#endif |
|||
#elif |
|||
xxx |
|||
#endif |
|||
//STEP 2 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<TYPE_UASER_BOARD CONFIG End
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
//Step3: >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>IRQ Config
|
|||
#if ((TYPE_MCU & TYPE_MCU_VENDOR_MSK) == TYPE_MCU_VENDOR_STC) |
|||
#define D_SERVE_INT0 interrupt 0 |
|||
#define D_SERVE_TIMER0 interrupt 1 |
|||
#define D_SERVE_INT1 interrupt 2 |
|||
#define D_SERVE_TIMER1 interrupt 3 |
|||
#define D_SERVE_UART interrupt 4 |
|||
#define D_SERVE_ADC interrupt 5 |
|||
#define D_SERVE_LVD interrupt 6 |
|||
#define D_SERVE_PCA interrupt 7 |
|||
#define D_SERVE_UART2 interrupt 8 |
|||
#define D_SERVE_SPI interrupt 9 |
|||
#define D_SERVE_INT2 interrupt 10 |
|||
#define D_SERVE_INT3 interrupt 11 |
|||
#define D_SERVE_TIMER2 interrupt 12 |
|||
#define D_SERVE_INT4 interrupt 16 |
|||
#define D_SERVE_UART3 interrupt 17 |
|||
#define D_SERVE_UART4 interrupt 18 |
|||
#define D_SERVE_TIMER3 interrupt 19 |
|||
#define D_SERVE_TIMER4 interrupt 20 |
|||
#define D_SERVE_CMP interrupt 21 |
|||
#define D_SERVE_PWM interrupt 22 |
|||
#define D_SERVE_PWMFD interrupt 23 |
|||
#define D_SERVE_I2C interrupt 24 |
|||
#endif |
|||
//STEP 3 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<IRQ Config End
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
//STEP 4 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Cdelay CONFIG
|
|||
#if(MainFre_5M == D_sys_MainFre) |
|||
#define D_Cdelay_200us 20 |
|||
#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令
|
|||
#elif(MainFre_22M == D_sys_MainFre) |
|||
#define D_Cdelay_200us 20 |
|||
#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令
|
|||
#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令
|
|||
#define L0_delay_1us() Lc_delay_nop(0) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us
|
|||
#define L0_delay_10us() Lc_delay_nop(4) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us
|
|||
#define L0_delay_40us() Lc_delay_nop(18) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us
|
|||
#elif(MainFre_27M == D_sys_MainFre) |
|||
#define D_Cdelay_200us 20 |
|||
#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令
|
|||
#else ///MainFre_11M
|
|||
#define D_Cdelay_200us 20 |
|||
#define D_Cdelay_1us 1 ////while p21翻转时测定 500k 2us 一个指令
|
|||
#define L0_delay_1us() Lc_delay_nop(0) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us
|
|||
#define L0_delay_10us() Lc_delay_nop(4) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us
|
|||
#define L0_delay_40us() Lc_delay_nop(18) // 5个nop() 100ns 50个nop() 1us (20)=10us (2)1.5us
|
|||
//xx
|
|||
#endif//D_sys_MainFre)
|
|||
//STEP 4 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Cdelay CONFIG End
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
//STEP 5 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Uart CONFIG
|
|||
#define SERIAL_MAX_NUM 2 |
|||
////fixme:和cpu的程序容量息息相关
|
|||
#define D_UART_send_buf_max 16 /// 9600bps = 10000bps = 1000 Bps = 1Byte/ms
|
|||
/// 19200bps = 20000bps = 2000Bps = 2Byte/ms = 1Byte/0.5ms
|
|||
/// 128Bytes = 128*0.5ms = 64ms
|
|||
#define D_UART_send_buf2_max 8 //此处改动会影响L0_uartN_ulhex函数
|
|||
//STEP 5 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Uart CONFIG End
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
//STEP 6 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Transmission Protocol Config
|
|||
#define D_TPC_CCMODBUS_Filter0 0xFF |
|||
#define D_TPC_CCMODBUS_Filter1 0xFE |
|||
#define D_TPC_DEBUG_FX_fi 0xF0 |
|||
#define D_TPC_DEBUG_FX_MASK 0x0F |
|||
#define D_TPC_HANDLER_X_LEN 128 |
|||
|
|||
//STEP 6 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Transmission Protocol Config End
|
|||
|
|||
|
|||
|
|||
extern void L0_board_config(void); |
|||
|
|||
|
|||
#endif//_BSP_CONFIG_H
|
|||
/*********************************end file*********************************************/ |
|||
|
@ -0,0 +1,161 @@ |
|||
////////////////////////////////////////////////////////////////////////////
|
|||
///@copyright Copyright (c) 2017, 传控科技 All rights reserved.
|
|||
///-------------------------------------------------------------------------
|
|||
/// @file bsp_config.h
|
|||
/// @brief hard config include
|
|||
/// @info FILE FOR HARDWARE SETUP AND SOFTWARE SETUP///FOR EXAMPLE: BAORD ,MCU,IDE
|
|||
/// @info YOU CAN CHANGE OR ADD THE DEFINE IF YOU NEED
|
|||
/// @info 整个嵌入式项目的入口 首先是确认电路板 然后确认cpu 芯片型号 然后确认编译器 之后是软件框架 最后是应用程序
|
|||
/// @info bsp_CONFIG 为其他头文件的始祖 TYPE_BOARD_xx
|
|||
///-------------------------------------------------------------------------
|
|||
/// @version 1.1
|
|||
/// @author CC
|
|||
/// @date 20180308
|
|||
/// @note
|
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
/// @version 5.1
|
|||
/// @author CC
|
|||
/// @date 20200301
|
|||
/// @note
|
|||
//////////////////////////////////////////////////////////////////////////////
|
|||
|
|||
|
|||
//////////////////////////////////////////////////////////////////////////
|
|||
///存储器中的特殊参数
|
|||
///全球唯一ID号 7FF9H~7FFFH BFF9H~BFFFH EFF9H~EFFFH FDF9H~FDFFH 7字节
|
|||
///内部1.19V参考信号源 7FF7H~7FF8H BFF7H~BFF8H EFF7H~EFF8H FDF7H~FDF8H 毫伏(高字节在前)
|
|||
///32K掉电唤醒定时器的频率 7FF5H~7FF6H BFF5H~BFF6H EFF5H~EFF6H FDF5H~FDF6H Hz (高字节在前)
|
|||
///22.1184MHz的IRC参数(20M频段) 7FF4H BFF4H EFF4H FDF4H -
|
|||
///24MHz的IRC参数(20M频段) 7FF3H BFF3H EFF3H FDF3H -
|
|||
///20MHz的IRC参数(20M频段) 7FF2H BFF2H EFF2H FDF2H
|
|||
///固件版本为7.3.12U
|
|||
///以及后续版本有效
|
|||
///27MHz的IRC参数(35M频段) 7FF1H BFF1H EFF1H FDF1H
|
|||
///30MHz的IRC参数(35M频段) 7FF0H BFF0H EFF0H FDF0H
|
|||
///33.1776MHz的IRC参数(35M频段) 7FEFH BFEFH EFEFH FDEFH
|
|||
///35MHz的IRC参数(35M频段) 7FEEH BFEEH EFEEH FDEEH
|
|||
///36.864MHz的IRC参数(35M频段) 7FEDH BFEDH EFEDH FDEDH
|
|||
///保留 7FECH BFECH EFECH FDECH
|
|||
///保留 7FEBH BFEBH EFEBH FDEBH
|
|||
///20M频段的VRTRIM参数 7FEAH BFEAH EFEAH FDEAH
|
|||
///35M频段的VRTRIM参数 7FE9H BFE9H EFE9H FDE9H
|
|||
//////////////////////////////////////////////////////////////////////////
|
|||
|
|||
#ifndef _BSP_CONFIG_CONST_H |
|||
#define _BSP_CONFIG_CONST_H |
|||
|
|||
#include <INTRINS.H> |
|||
#include "../clib/type.h" |
|||
#include "../clib/bit.h" |
|||
|
|||
//>>>>>>>>>>>>>>>>>>>>>>.BORAD TYPE
|
|||
#define TYPE_BOARD_hhnew 1 |
|||
#define TYPE_BOARD_st_sleep04_01 4 |
|||
#define TYPE_BOARD_st_sleep03 5 |
|||
#define TYPE_BOARD_SMMM_MB_VH032_0E 6 |
|||
#define TYPE_BOARD_LPC17xx_ 8 |
|||
#define TYPE_BOARD_STM32F_103ZET6_READBULL 1036 |
|||
#define TYPE_BOARD_hh_CC_MD_VH05_anyriny_simple_m51 0x0551 |
|||
#define TYPE_BOARD_hh_CC_MD_VH06_asMain_m6a7 0x6a7 |
|||
#define TYPE_BOARD_TI26_MT01_M178 0x178 //会议计时器版v TI26_MT01-M178
|
|||
#define TYPE_BOARD_stc5as32_WIFIBV01 532 |
|||
#define TYPE_BOARD_SHC16LAXXQN32 1632 //SHC16LAXXQN32
|
|||
#define TYPE_BOARD_PAPER6133_M0A6 0xa6 //打印机纸张传感
|
|||
#define TYPE_BOARD_GSM_MAIN_V07 0xa7 //打印机运维板
|
|||
#define TYPE_BOARD_ADDA_MAIN_V02 0xa8 //ADDA
|
|||
#define TYPE_BOARD_433_0A 0xa9 //433
|
|||
#define TYPE_BOARD_WEIGH_0B 0xaa //称重
|
|||
#define TYPE_BOARD_TOUCH_PEN_0B 0xab //点读笔
|
|||
//<<<<<<<<<<<<<<<<<<<<<<<<<<<.BORAD TYPE end
|
|||
|
|||
//>>>>>>>>>>>>>>>>>>>>>>MCU TYPE
|
|||
#define TYPE_MCU_VENDOR_MSK 0xF0 |
|||
#define TYPE_MCU_VENDOR_STC 0x10 |
|||
#define TYPE_MCU_STC_8A 0x11 |
|||
#define TYPE_MCU_STC_8F 0x12 |
|||
#define TYPE_MCU_STC_8G 0x13 |
|||
#define TYPE_MCU_STC_8H 0x14 |
|||
|
|||
#define TYPE_MCU_VENDOR_TI 0x60 |
|||
#define TYPE_MCU_SHC6601 0x66 |
|||
#define TYPE_MCU_LPC17xx 0x67 |
|||
#define TYPE_MCU_STM32 0x68 |
|||
|
|||
#define D_CPUfamily_8bits 8 |
|||
#define D_CPUfamily_16bits 16 |
|||
#define D_CPUfamily_32bits 32 |
|||
//<<<<<<<<<<<<<<<<<<<<<<MCU TYPE end
|
|||
|
|||
//>>>>>>>>>>>>>>>>>>>>>>IDE TYPE
|
|||
#define TYPE_IDE_KEIL 1 |
|||
#define TYPE_IDE_MDK 2 |
|||
#define TYPE_IDE_IAR 3 |
|||
//<<<<<<<<<<<<<<<<<<<<<<IDE TYPE end
|
|||
|
|||
//>>>>>>>>>>>>>>>>>>>>>>SysTimer TYPE
|
|||
#define TYPE_JIFFIES_5MS 5 |
|||
#define TYPE_JIFFIES_10MS 10 |
|||
#define TYPE_JIFFIES_25MS 25 |
|||
//<<<<<<<<<<<<<<<<<<<<<<<<<<<SysTimer TYPE end
|
|||
|
|||
//>>>>>>>>>>>>>>>>>>>>>>.WDT TYPE
|
|||
#define TYPE_WDT_DISABLE 1 |
|||
#define TYPE_WDT_ENABLE 2 |
|||
//#define WDT_FEED() WDT_CONTR |= 0x10
|
|||
//<<<<<<<<<<<<<<<<<<<<<<<<<<<.SysTimer TYPE end
|
|||
|
|||
//>>>>>>>>>>>>>>>>>>>>>>.ByteOrder TYPE
|
|||
#define TYPE_MCU_BIGENDIAN 1 //大端字节序
|
|||
#define TYPE_MCU_LITENDIAN 2 //小端字节序
|
|||
//<<<<<<<<<<<<<<<<<<<<<<<<<<<.ByteOrder TYPE end
|
|||
|
|||
//>>>>>>>>>>>>>>>>>>>>>>.代码加密 TYPE
|
|||
#define TYPE_ENCRYPTION_ENABLE 1 //代码加密
|
|||
#define TYPE_ENCRYPTION_DISABLE 2 //代码不加密
|
|||
//<<<<<<<<<<<<<<<<<<<<<<<<<<<.ByteOrder TYPE end
|
|||
|
|||
//>>>>>>>>>>>>>>>>>>>>>>BUADRATE & StopBit
|
|||
#define SBIT_1 1 //1 stop bit
|
|||
#define SBIT_2 2 //2 stop bit
|
|||
#define BRT_115200 115200 |
|||
#define BRT_19200 19200 |
|||
#define BRT_9600 9600 |
|||
#define BRT_4800 4800 |
|||
//<<<<<<<<<<<<<<<<<<<<<<BUADRATE & StopBit end
|
|||
|
|||
//>>>>>>>>>>>>>>>>>>>>>>MainFre
|
|||
#define MainFre_5M 5529600L |
|||
#define MainFre_11M 11059200L |
|||
#define MainFre_22M 22118400L |
|||
#define MainFre_24M 24000000L |
|||
#define MainFre_27M 27000000L |
|||
//<<<<<<<<<<<<<<<<<<<<<<MainFre end
|
|||
|
|||
//>>>>>>>>>>>>>>>>>>>>>>UART0 PIN
|
|||
#define PIN_UART0_Rxd_30_Txd_31 1 |
|||
#define PIN_UART0_Rxd_36_Txd_37 2 |
|||
#define PIN_UART0_Rxd_16_Txd_17 3 |
|||
#define PIN_UART0_Rxd_43_Txd_44 4 |
|||
//<<<<<<<<<<<<<<<<<<<<<<<<<<<.UART0 PIN
|
|||
//>>>>>>>>>>>>>>>>>>>>>>UART2 PIN
|
|||
#define PIN_UART2_Rxd_10_Txd_11 5 |
|||
|
|||
//<<<<<<<<<<<<<<<<<<<<<<<<<<<.UART2 PIN
|
|||
|
|||
//>>>>>>>>>>>>>>>>>>>>>>485 Type
|
|||
#define TYPE_485_NONE 0 |
|||
#define TYPE_485_MASTER 1 |
|||
#define TYPE_485_SLAVER 2 |
|||
//<<<<<<<<<<<<<<<<<<<<<<485 Type end
|
|||
|
|||
//>>>>>>>>>>>>>>>>>>>>>>G-SENSOR TYPE
|
|||
#define TYPE_ASENSOR_ADXL362 362 |
|||
#define TYPE_ASENSOR_MSA300 300 |
|||
#define TYPE_ASENSOR TYPE_ASENSOR_MSA300 |
|||
//<<<<<<<<<<<<<<<<<<<<<<G-SENSOR TYPE end
|
|||
|
|||
|
|||
|
|||
#endif//_BSP_CONFIG_CONST_H
|
|||
/*********************************end file*********************************************/ |
|||
|
@ -0,0 +1,355 @@ |
|||
//////////////////////////////////////////////////////////////////////////
|
|||
/// COPYRIGHT NOTICE
|
|||
/// Copyright (c) 2020, 传控科技
|
|||
/// All rights reserved.
|
|||
///
|
|||
/// @file main.c
|
|||
/// @brief main app
|
|||
///
|
|||
///(本文件实现的功能的详述)
|
|||
///
|
|||
/// @version 1.1 CCsens technology
|
|||
/// @author CC
|
|||
/// @date 20150102
|
|||
///
|
|||
///
|
|||
/// 修订说明:最初版本
|
|||
/// Modified by: cc
|
|||
/// Modified date: 20200531
|
|||
/// Version:
|
|||
/// Descriptions: add u8
|
|||
/// Modified by: cc
|
|||
/// Modified date: 20211222
|
|||
/// Version:
|
|||
/// Descriptions: add uint32_t
|
|||
#if 0 |
|||
abs(x) |
|||
{ |
|||
y = x<<31; |
|||
return(x^y)-y;//也可写作 (x+y)^y
|
|||
} |
|||
#endif |
|||
//////////////////////////////////////////////////////////////////////////
|
|||
|
|||
|
|||
//#include <stdint.h>
|
|||
|
|||
#ifndef __TYPE_H__ |
|||
#define __TYPE_H__ |
|||
|
|||
#ifndef NULL |
|||
#define NULL ((void *)0) |
|||
#endif |
|||
|
|||
#ifndef FALSE |
|||
#define FALSE (0) |
|||
#endif |
|||
|
|||
#ifndef D_stop |
|||
#define D_stop (1) |
|||
#endif |
|||
|
|||
#ifndef D_run |
|||
#define D_run (0) |
|||
#endif |
|||
|
|||
#ifndef D_ready |
|||
#define D_ready (1) |
|||
#endif |
|||
|
|||
#ifndef D_ready2 |
|||
#define D_ready2 (2) |
|||
#endif |
|||
|
|||
|
|||
#ifndef D_max |
|||
#define D_max (3) |
|||
#endif |
|||
|
|||
|
|||
|
|||
#ifndef D_diff |
|||
#define D_diff (4) |
|||
#endif |
|||
|
|||
#ifndef D_set |
|||
#define D_set (1) |
|||
#endif |
|||
|
|||
|
|||
|
|||
#ifndef D_clear |
|||
#define D_clear (0) |
|||
#endif |
|||
#define D_ON 1 |
|||
#define D_OFF 0 |
|||
|
|||
#define D_sleep_wakeup 3 |
|||
#define D_sleep 1 |
|||
#define D_wakeup 0 |
|||
|
|||
#ifndef TRUE |
|||
#define TRUE (1) |
|||
#endif |
|||
|
|||
/*********************************************************************************************************
|
|||
定义与编译器无关的数据类型 |
|||
*********************************************************************************************************/ |
|||
|
|||
typedef unsigned char U8; |
|||
typedef unsigned char u8; |
|||
typedef volatile U8 vU8; |
|||
|
|||
|
|||
|
|||
typedef U8 BOOLEAN; /* 布尔变量 */ |
|||
typedef U8 *PU8; |
|||
typedef U8 BYTE; |
|||
typedef signed char S8; |
|||
typedef volatile signed char vS8; |
|||
typedef signed char *PS8; |
|||
|
|||
|
|||
|
|||
#define bit char |
|||
//#define code
|
|||
|
|||
typedef unsigned short u16; |
|||
typedef unsigned short U16; /* 无符号16位整型变量 */ |
|||
typedef volatile U16 vU16; /* 无符号16位整型变量 */ |
|||
typedef signed short S16; |
|||
typedef volatile S16 vS16; /* 有符号16位整型变量 */ |
|||
|
|||
typedef signed long S32; |
|||
typedef unsigned long U32; /* 无符号32位整型变量 */ |
|||
typedef volatile U32 vU32; /* 有符号32位整型变量 */ |
|||
typedef volatile signed long vS32; |
|||
|
|||
typedef float FP32; /* 单精度浮点数(32位长度) */ |
|||
typedef double FP64; /* 双精度浮点数(64位长度) */ |
|||
|
|||
|
|||
//typedef unsigned char BOOLEAN; // 布尔变量
|
|||
typedef unsigned char INT8U; // 无符号8位整型变量
|
|||
typedef signed char INT8S; // 有符号8位整型变量
|
|||
typedef unsigned short INT16U; // 无符号16位整型变量
|
|||
typedef signed short INT16S; // 有符号16位整型变量
|
|||
typedef unsigned long INT32U; // 无符号32位整型变量
|
|||
|
|||
typedef signed long INT32S; // 有符号32位整型变量
|
|||
//typedef float FP32; // 单精度浮点数(32位长度)
|
|||
//typedef double FP64; // 双精度浮点数(64位长度)
|
|||
|
|||
typedef unsigned int FLAG_P; // 标准类变量
|
|||
//typedef unsigned char INTU; // 标准类变量8BIT MCU
|
|||
typedef unsigned int INTU; // 标准类变量32BIT MCU
|
|||
/******************
|
|||
**************************/ |
|||
|
|||
|
|||
|
|||
/*********************************************************************************************************
|
|||
返回值定义 |
|||
*********************************************************************************************************/ |
|||
#define ZY_OK 0 /* 操作成功 */ |
|||
#define ZY_NOT_OK 1 /* 操作失败 */ |
|||
#define ZY_PARAMETER_ERR 2 /* 参数错误 */ |
|||
#define ZY_NO_FIND_FUNCTION 6 /* 没有发现指定函数 */ |
|||
#define ZY_NO_MEMORY 12 /* 内存不足 */ |
|||
#define ZY_TIME_OUT 13 /* 超时 */ |
|||
#define ZY_NO_FIND_OBJECT 16 /* 没有发现对象 */ |
|||
|
|||
/*********************************************************************************************************
|
|||
realView编译器需要添加的头文件 |
|||
*********************************************************************************************************/ |
|||
#include <ctype.h> |
|||
#include <stdlib.h> |
|||
#include <setjmp.h> |
|||
//#include <rt_misc.h>
|
|||
#define D_flag_lock 2 |
|||
#define D_flag_clear 0 |
|||
#define D_flag_CanUse 1 |
|||
|
|||
|
|||
typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus; |
|||
typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; |
|||
|
|||
typedef U8 UN_TYPE; |
|||
typedef U8 vtype; |
|||
|
|||
/// >>>>>>>>>>>>>>>>>>>cc: sd znfat
|
|||
#define UINT8 unsigned char |
|||
#define UINT16 unsigned int |
|||
#define UINT32 unsigned long |
|||
|
|||
#define INT8 char |
|||
#define INT16 int |
|||
#define INT32 long |
|||
|
|||
#define ROM_TYPE_UINT8 unsigned char code |
|||
#define ROM_TYPE_UINT16 unsigned int code |
|||
#define ROM_TYPE_UINT32 unsigned long code |
|||
|
|||
///<<<<<<<<<<<<<<<<<<<<<<cc: sd znfat
|
|||
|
|||
|
|||
/*************
|
|||
|
|||
******************/ |
|||
|
|||
//>>>>>
|
|||
|
|||
|
|||
typedef union |
|||
{ |
|||
vU32 ui; |
|||
vU16 s[2]; |
|||
vU8 d[4]; |
|||
}tu_ui4uc; |
|||
|
|||
typedef union |
|||
{ |
|||
vU16 word; |
|||
struct |
|||
{ |
|||
vU8 h; |
|||
vU8 l; |
|||
}BYTE2; |
|||
}U_U16; |
|||
|
|||
typedef union |
|||
{ |
|||
vU32 dWord; |
|||
///High 0123 Low
|
|||
struct |
|||
{ |
|||
vU8 byte0; |
|||
vU8 byte1; |
|||
vU8 byte2; |
|||
vU8 byte3; |
|||
}BYTE4; |
|||
}U_U32; |
|||
typedef union |
|||
{ |
|||
vU32 d32[2]; |
|||
|
|||
vU16 d16[4]; |
|||
|
|||
vU8 d[8]; |
|||
}U_U64; |
|||
|
|||
|
|||
typedef union |
|||
{ |
|||
vU16 us; |
|||
vU8 uc[2]; |
|||
struct |
|||
{ |
|||
vU8 H; |
|||
vU8 L; |
|||
}BYTE2; |
|||
}U_F16; |
|||
/**********
|
|||
k.us = 0x1234 |
|||
uc |
|||
[0]=0x12 |
|||
[1]=0x34 |
|||
byte2 |
|||
H=0x12 |
|||
L=0x34 |
|||
|
|||
**********/ |
|||
|
|||
|
|||
|
|||
typedef union |
|||
{ |
|||
float fl; |
|||
vU8 uc[4]; |
|||
|
|||
}U_F32; |
|||
|
|||
typedef struct |
|||
{ |
|||
vU8 *buffer; |
|||
vU8 wpt; |
|||
vU8 rpt; |
|||
vU8 cnt; |
|||
}byte_len_fifo_struct; |
|||
|
|||
typedef struct |
|||
{ |
|||
vU16 *buffer; |
|||
vU16 wpt; |
|||
vU16 rpt; |
|||
vU16 cnt; |
|||
}word_len_fifo_struct; |
|||
|
|||
typedef struct |
|||
{ |
|||
vU16 x; |
|||
vU16 y; |
|||
}point_struct; |
|||
|
|||
|
|||
typedef struct |
|||
{ |
|||
vU16 x; |
|||
vU16 y; |
|||
vU16 width; |
|||
vU16 height; |
|||
}rect_struct; |
|||
|
|||
|
|||
#define HIGHT 1 |
|||
#define LOW 0 |
|||
#if 0 |
|||
#ifndef MIN |
|||
#define MIN(a,b) (((a) < (b)) ? (a) : (b)) |
|||
#endif |
|||
|
|||
#ifndef MAX |
|||
#define MAX(a, b) (((a) > (b)) ? (a) : (b)) |
|||
#endif |
|||
#endif |
|||
#ifndef ABS |
|||
#define ABS(a, b) (((a) > (b)) ? ((a) - (b)) : ((b) - (a))) |
|||
#endif |
|||
|
|||
|
|||
#define F_FINSIH 1 |
|||
#define F_WORKING 0 |
|||
#define F_WAITINGKEY 2 |
|||
|
|||
|
|||
#define DF_var_up(v,step,max,init) (v) += (step);if((v) > (max)) (v) = (init); |
|||
//if step > 1 bug warning!!
|
|||
#define DF_var_down(v,step,min,init) \ |
|||
if((v) < ((min) + (step))) \ |
|||
{ \ |
|||
(v) = (init); \ |
|||
}else \ |
|||
{ \ |
|||
(v) -= (step); \ |
|||
} |
|||
|
|||
#define D_us2uc_H(x) (U8)(0x00ff&((x)>>8)) |
|||
#define D_us2uc_L(x) (U8)(0x00ff&(x)) |
|||
|
|||
|
|||
#define D_2uc2_us(H,L) ((((U16)H)<<8)|((U16)L)) |
|||
|
|||
#define D_ul2uc_0(xx) (U8)(0x000000ff&(xx)) |
|||
#define D_uc_high(ww) ((ww)>>4) |
|||
#define D_uc_low(ww) ((ww)&0x0f) |
|||
|
|||
#define L0_type_byte(x) ((U8 *) &(x)) |
|||
|
|||
|
|||
//#define _nop_ __NOP
|
|||
// #define _nop_
|
|||
|
|||
|
|||
extern void L3_us_big(U16 *d); |
|||
extern void L3_ui_big(vU32 *d); |
|||
#endif /* __TYPE_H__ */ |
File diff suppressed because it is too large
@ -0,0 +1,301 @@ |
|||
//////////////////////////////////////////////////////////////////////////
|
|||
/// COPYRIGHT NOTICE
|
|||
/// Copyright (c) 2018, 传控科技
|
|||
/// All rights reserved.
|
|||
///
|
|||
/// @file __C51_MACRO_H_
|
|||
/// @brief macro define 和cpu相关,可以和同一个系列的cpu共享
|
|||
///
|
|||
///(本文件实现的功能的详述)
|
|||
///
|
|||
/// @version 1.1 CCsens technology
|
|||
/// @author CC
|
|||
/// @date 20180102
|
|||
|
|||
//
|
|||
//////////////////////////////////////////////////////////////////////////
|
|||
|
|||
|
|||
|
|||
#ifndef __C51_MACRO_H_ |
|||
#define __C51_MACRO_H_ |
|||
|
|||
#include<intrins.h> |
|||
|
|||
#define D_P07_ON() P07 = 1 |
|||
#define D_P06_ON() P06 = 1 |
|||
#define D_P05_ON() P05 = 1 |
|||
#define D_P04_ON() P04 = 1 |
|||
#define D_P03_ON() P03 = 1 |
|||
#define D_P02_ON() P02 = 1 |
|||
#define D_P01_ON() P01 = 1 |
|||
#define D_P00_ON() P00 = 1 |
|||
#define D_P07_OFF() P07 = 0 |
|||
#define D_P06_OFF() P06 = 0 |
|||
#define D_P05_OFF() P05 = 0 |
|||
#define D_P04_OFF() P04 = 0 |
|||
#define D_P03_OFF() P03 = 0 |
|||
#define D_P02_OFF() P02 = 0 |
|||
#define D_P01_OFF() P01 = 0 |
|||
#define D_P00_OFF() P00 = 0 |
|||
#define D_P07_AT() (P07) |
|||
#define D_P06_AT() (P06) |
|||
#define D_P05_AT() (P05) |
|||
#define D_P04_AT() (P04) |
|||
#define D_P03_AT() (P03) |
|||
#define D_P02_AT() (P02) |
|||
#define D_P01_AT() (P01) |
|||
#define D_P00_AT() (P00) |
|||
#define D_P07_REV() P07 = ~P07 |
|||
#define D_P06_REV() P06 = ~P06 |
|||
#define D_P05_REV() P05 = ~P05 |
|||
#define D_P04_REV() P04 = ~P04 |
|||
#define D_P03_REV() P03 = ~P03 |
|||
#define D_P02_REV() P02 = ~P02 |
|||
#define D_P01_REV() P01 = ~P01 |
|||
#define D_P00_REV() P00 = ~P00 |
|||
|
|||
|
|||
#define D_P17_ON() P17 = 1 |
|||
#define D_P16_ON() P16 = 1 |
|||
#define D_P15_ON() P15 = 1 |
|||
#define D_P14_ON() P14 = 1 |
|||
#define D_P13_ON() P13 = 1 |
|||
#define D_P12_ON() P12 = 1 |
|||
#define D_P11_ON() P11 = 1 |
|||
#define D_P10_ON() P10 = 1 |
|||
#define D_P17_OFF() P17 = 0 |
|||
#define D_P16_OFF() P16 = 0 |
|||
#define D_P15_OFF() P15 = 0 |
|||
#define D_P14_OFF() P14 = 0 |
|||
#define D_P13_OFF() P13 = 0 |
|||
#define D_P12_OFF() P12 = 0 |
|||
#define D_P11_OFF() P11 = 0 |
|||
#define D_P10_OFF() P10 = 0 |
|||
#define D_P17_AT() (P17) |
|||
#define D_P16_AT() (P16) |
|||
#define D_P15_AT() (P15) |
|||
#define D_P14_AT() (P14) |
|||
#define D_P13_AT() (P13) |
|||
#define D_P12_AT() (P12) |
|||
#define D_P11_AT() (P11) |
|||
#define D_P10_AT() (P10) |
|||
#define D_P17_REV() P17 = ~P17 |
|||
#define D_P16_REV() P16 = ~P16 |
|||
#define D_P15_REV() P15 = ~P15 |
|||
#define D_P14_REV() P14 = ~P14 |
|||
#define D_P13_REV() P13 = ~P13 |
|||
#define D_P12_REV() P12 = ~P12 |
|||
#define D_P11_REV() P11 = ~P11 |
|||
#define D_P10_REV() P10 = ~P10 |
|||
|
|||
#define D_P27_ON() P27 = 1 |
|||
#define D_P26_ON() P26 = 1 |
|||
#define D_P25_ON() P25 = 1 |
|||
#define D_P24_ON() P24 = 1 |
|||
#define D_P23_ON() P23 = 1 |
|||
#define D_P22_ON() P22 = 1 |
|||
#define D_P21_ON() P21 = 1 |
|||
#define D_P20_ON() P20 = 1 |
|||
#define D_P27_OFF() P27 = 0 |
|||
#define D_P26_OFF() P26 = 0 |
|||
#define D_P25_OFF() P25 = 0 |
|||
#define D_P24_OFF() P24 = 0 |
|||
#define D_P23_OFF() P23 = 0 |
|||
#define D_P22_OFF() P22 = 0 |
|||
#define D_P21_OFF() P21 = 0 |
|||
#define D_P20_OFF() P20 = 0 |
|||
#define D_P27_AT() (P27) |
|||
#define D_P26_AT() (P26) |
|||
#define D_P25_AT() (P25) |
|||
#define D_P24_AT() (P24) |
|||
#define D_P23_AT() (P23) |
|||
#define D_P22_AT() (P22) |
|||
#define D_P21_AT() (P21) |
|||
#define D_P20_AT() (P20) |
|||
#define D_P27_REV() P27 = ~P27 |
|||
#define D_P26_REV() P26 = ~P26 |
|||
#define D_P25_REV() P25 = ~P25 |
|||
#define D_P24_REV() P24 = ~P24 |
|||
#define D_P23_REV() P23 = ~P23 |
|||
#define D_P22_REV() P22 = ~P22 |
|||
#define D_P21_REV() P21 = ~P21 |
|||
#define D_P20_REV() P20 = ~P20 |
|||
|
|||
|
|||
#define D_P37_ON() P37 = 1 |
|||
#define D_P36_ON() P36 = 1 |
|||
#define D_P35_ON() P35 = 1 |
|||
#define D_P34_ON() P34 = 1 |
|||
#define D_P33_ON() P33 = 1 |
|||
#define D_P32_ON() P32 = 1 |
|||
#define D_P31_ON() P31 = 1 |
|||
#define D_P30_ON() P30 = 1 |
|||
#define D_P37_OFF() P37 = 0 |
|||
#define D_P36_OFF() P36 = 0 |
|||
#define D_P35_OFF() P35 = 0 |
|||
#define D_P34_OFF() P34 = 0 |
|||
#define D_P33_OFF() P33 = 0 |
|||
#define D_P32_OFF() P32 = 0 |
|||
#define D_P31_OFF() P31 = 0 |
|||
#define D_P30_OFF() P30 = 0 |
|||
#define D_P37_AT() (P37) |
|||
#define D_P36_AT() (P36) |
|||
#define D_P35_AT() (P35) |
|||
#define D_P34_AT() (P34) |
|||
#define D_P33_AT() (P33) |
|||
#define D_P32_AT() (P32) |
|||
#define D_P31_AT() (P31) |
|||
#define D_P30_AT() (P30) |
|||
#define D_P37_REV() P37 = ~P37 |
|||
#define D_P36_REV() P36 = ~P36 |
|||
#define D_P35_REV() P35 = ~P35 |
|||
#define D_P34_REV() P34 = ~P34 |
|||
#define D_P33_REV() P33 = ~P33 |
|||
#define D_P32_REV() P32 = ~P32 |
|||
#define D_P31_REV() P31 = ~P31 |
|||
#define D_P30_REV() P30 = ~P30 |
|||
|
|||
|
|||
#define D_P47_ON() P47 = 1 |
|||
#define D_P46_ON() P46 = 1 |
|||
#define D_P45_ON() P45 = 1 |
|||
#define D_P44_ON() P44 = 1 |
|||
#define D_P43_ON() P43 = 1 |
|||
#define D_P42_ON() P42 = 1 |
|||
#define D_P41_ON() P41 = 1 |
|||
#define D_P40_ON() P40 = 1 |
|||
#define D_P47_OFF() P47 = 0 |
|||
#define D_P46_OFF() P46 = 0 |
|||
#define D_P45_OFF() P45 = 0 |
|||
#define D_P44_OFF() P44 = 0 |
|||
#define D_P43_OFF() P43 = 0 |
|||
#define D_P42_OFF() P42 = 0 |
|||
#define D_P41_OFF() P41 = 0 |
|||
#define D_P40_OFF() P40 = 0 |
|||
#define D_P47_AT() (P47) |
|||
#define D_P46_AT() (P46) |
|||
#define D_P45_AT() (P45) |
|||
#define D_P44_AT() (P44) |
|||
#define D_P43_AT() (P43) |
|||
#define D_P42_AT() (P42) |
|||
#define D_P41_AT() (P41) |
|||
#define D_P40_AT() (P40) |
|||
#define D_P47_REV() P47 = ~P47 |
|||
#define D_P46_REV() P46 = ~P46 |
|||
#define D_P45_REV() P45 = ~P45 |
|||
#define D_P44_REV() P44 = ~P44 |
|||
#define D_P43_REV() P43 = ~P43 |
|||
#define D_P42_REV() P42 = ~P42 |
|||
#define D_P41_REV() P41 = ~P41 |
|||
#define D_P40_REV() P40 = ~P40 |
|||
|
|||
#define D_P57_ON() P57 = 1 |
|||
#define D_P56_ON() P56 = 1 |
|||
#define D_P55_ON() P55 = 1 |
|||
#define D_P54_ON() P54 = 1 |
|||
#define D_P53_ON() P53 = 1 |
|||
#define D_P52_ON() P52 = 1 |
|||
#define D_P51_ON() P51 = 1 |
|||
#define D_P50_ON() P50 = 1 |
|||
#define D_P57_OFF() P57 = 0 |
|||
#define D_P56_OFF() P56 = 0 |
|||
#define D_P55_OFF() P55 = 0 |
|||
#define D_P54_OFF() P54 = 0 |
|||
#define D_P53_OFF() P53 = 0 |
|||
#define D_P52_OFF() P52 = 0 |
|||
#define D_P51_OFF() P51 = 0 |
|||
#define D_P50_OFF() P50 = 0 |
|||
#define D_P57_AT() (P57) |
|||
#define D_P56_AT() (P56) |
|||
#define D_P55_AT() (P55) |
|||
#define D_P54_AT() (P54) |
|||
#define D_P53_AT() (P53) |
|||
#define D_P52_AT() (P52) |
|||
#define D_P51_AT() (P51) |
|||
#define D_P50_AT() (P50) |
|||
#define D_P57_REV() P57 = ~P57 |
|||
#define D_P56_REV() P56 = ~P56 |
|||
#define D_P55_REV() P55 = ~P55 |
|||
#define D_P54_REV() P54 = ~P54 |
|||
#define D_P53_REV() P53 = ~P53 |
|||
#define D_P52_REV() P52 = ~P52 |
|||
#define D_P51_REV() P51 = ~P51 |
|||
#define D_P50_REV() P50 = ~P50 |
|||
|
|||
#define D_P67_ON() P67 = 1 |
|||
#define D_P66_ON() P66 = 1 |
|||
#define D_P65_ON() P65 = 1 |
|||
#define D_P64_ON() P64 = 1 |
|||
#define D_P63_ON() P63 = 1 |
|||
#define D_P62_ON() P62 = 1 |
|||
#define D_P61_ON() P61 = 1 |
|||
#define D_P60_ON() P60 = 1 |
|||
#define D_P67_OFF() P67 = 0 |
|||
#define D_P66_OFF() P66 = 0 |
|||
#define D_P65_OFF() P65 = 0 |
|||
#define D_P64_OFF() P64 = 0 |
|||
#define D_P63_OFF() P63 = 0 |
|||
#define D_P62_OFF() P62 = 0 |
|||
#define D_P61_OFF() P61 = 0 |
|||
#define D_P60_OFF() P60 = 0 |
|||
#define D_P67_AT() (P67) |
|||
#define D_P66_AT() (P66) |
|||
#define D_P65_AT() (P65) |
|||
#define D_P64_AT() (P64) |
|||
#define D_P63_AT() (P63) |
|||
#define D_P62_AT() (P62) |
|||
#define D_P61_AT() (P61) |
|||
#define D_P60_AT() (P60) |
|||
#define D_P67_REV() P67 = ~P67 |
|||
#define D_P66_REV() P66 = ~P66 |
|||
#define D_P65_REV() P65 = ~P65 |
|||
#define D_P64_REV() P64 = ~P64 |
|||
#define D_P63_REV() P63 = ~P63 |
|||
#define D_P62_REV() P62 = ~P62 |
|||
#define D_P61_REV() P61 = ~P61 |
|||
#define D_P60_REV() P60 = ~P60 |
|||
|
|||
#define D_P77_ON() P77 = 1 |
|||
#define D_P76_ON() P76 = 1 |
|||
#define D_P75_ON() P75 = 1 |
|||
#define D_P74_ON() P74 = 1 |
|||
#define D_P73_ON() P73 = 1 |
|||
#define D_P72_ON() P72 = 1 |
|||
#define D_P71_ON() P71 = 1 |
|||
#define D_P70_ON() P70 = 1 |
|||
#define D_P77_OFF() P77 = 0 |
|||
#define D_P76_OFF() P76 = 0 |
|||
#define D_P75_OFF() P75 = 0 |
|||
#define D_P74_OFF() P74 = 0 |
|||
#define D_P73_OFF() P73 = 0 |
|||
#define D_P72_OFF() P72 = 0 |
|||
#define D_P71_OFF() P71 = 0 |
|||
#define D_P70_OFF() P70 = 0 |
|||
#define D_P77_AT() (P77) |
|||
#define D_P76_AT() (P76) |
|||
#define D_P75_AT() (P75) |
|||
#define D_P74_AT() (P74) |
|||
#define D_P73_AT() (P73) |
|||
#define D_P72_AT() (P72) |
|||
#define D_P71_AT() (P71) |
|||
#define D_P70_AT() (P70) |
|||
#define D_P77_REV() P77 = ~P77 |
|||
#define D_P76_REV() P76 = ~P76 |
|||
#define D_P75_REV() P75 = ~P75 |
|||
#define D_P74_REV() P74 = ~P74 |
|||
#define D_P73_REV() P73 = ~P73 |
|||
#define D_P72_REV() P72 = ~P72 |
|||
#define D_P71_REV() P71 = ~P71 |
|||
#define D_P70_REV() P70 = ~P70 |
|||
|
|||
|
|||
|
|||
#endif //__C51_MACRO_H_
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
@ -0,0 +1,258 @@ |
|||
//////////////////////////////////////////////////////////////////////////
|
|||
/// COPYRIGHT NOTICE
|
|||
/// Copyright (c) 2022, 传控科技
|
|||
/// All rights reserved.
|
|||
///
|
|||
/// @file __STC_ONLY_H_
|
|||
/// @brief macro define 和cpu相关,STC独有的 使用stc系列单片机是使用
|
|||
///
|
|||
///(本文件实现的功能的详述)
|
|||
///
|
|||
/// @version 1.0 CCsens technology
|
|||
/// @author CC
|
|||
/// @date 20211226
|
|||
|
|||
//
|
|||
//////////////////////////////////////////////////////////////////////////
|
|||
|
|||
|
|||
|
|||
#ifndef __STC_ONLY_H_ |
|||
#define __STC_ONLY_H_ |
|||
|
|||
#include<intrins.h> |
|||
|
|||
#define ET3 0x20 |
|||
#define T3IF 0x02 |
|||
|
|||
///#define ES2 0x01
|
|||
///#define ES3 0x08
|
|||
|
|||
#define S2TI 0x02 |
|||
#define S2RI 0x01 |
|||
#define S3TI 0x02 |
|||
#define S3RI 0x01 |
|||
#define ET4 0x40 |
|||
|
|||
|
|||
|
|||
|
|||
///#define I2CTXD (*(unsigned char volatile xdata *)0xfE86)//423@ST8.PDF
|
|||
|
|||
///#define I2CRXD (*(unsigned char volatile xdata *)0xfE87)//423@ST8.PDF
|
|||
|
|||
|
|||
|
|||
///-------------------------------------
|
|||
|
|||
#define gRccUs01_H (*(unsigned char volatile data *)0xd2) |
|||
#define gRccUs01_L (*(unsigned char volatile data *)0xd3) |
|||
|
|||
|
|||
|
|||
#define gRccUs01 (*(unsigned short volatile data *)0xd2)//226@ST8.PDF T4H定时器4的高字节 D2H T4H定时器4的低字节 D3H
|
|||
#define gRccUs02 (*(unsigned short volatile data *)0xEA)//351@ST8.PDF CCAP0l CCAP1L EAH EBH
|
|||
#define gRccUs03 (*(unsigned short volatile data *)0xEC)//351@ST8.PDF CCAP0l CCAP1L EAH EBH
|
|||
//#define gRccUs03 s_task_GC032A.n
|
|||
|
|||
|
|||
|
|||
#define gRccUs04 (*(unsigned short volatile data *)0xFA)///351@ST8.PDF
|
|||
#define gRccUs05 (*(unsigned short volatile data *)0xFC)///351@ST8.PD CCAP2H
|
|||
|
|||
/////////////////////////////////////////////////
|
|||
|
|||
#ifdef docasdfasdf |
|||
符号 地址 B7 B6 B5 B4 B3 B2 B1 B0 |
|||
IE2 AFH EUSB ET4 ET3 ES4 ES3 ET2 ESPI ES2 |
|||
|
|||
EUSB∶USB中断允许位。 |
|||
0∶禁止 USB中断1∶允许 USB中断 |
|||
ET4∶定时/计数器T4的溢出中断允许位。 |
|||
0∶禁止 T4中断1∶允许T4中断 |
|||
ET3∶定时/计数器 T3的溢出中断允许位。 |
|||
0∶禁止 T3中断1∶允许T3中断 |
|||
ES4∶串行口4中断允许位。 |
|||
0∶禁止串行口4中断1∶允许串行口 4中断ES3∶串行口3中断允许位。 |
|||
0∶禁止串行口3中断1∶允许串行口3中断 |
|||
ET2∶定时/计数器 T2的溢出中断允许位。 |
|||
0∶禁止T2中断1∶允许T3中断ESPI∶SPI中断允许位。 |
|||
0∶禁止 SPI中断1∶允许 SPI中断 |
|||
ES2∶串行口 2中断允许位。 |
|||
0∶禁止串行口2中断1∶允许串行口2中断 |
|||
|
|||
|
|||
#endif |
|||
|
|||
#define ES4 BITN4 |
|||
#define ES3 BITN3 |
|||
#define ES2 BITN0 |
|||
|
|||
|
|||
|
|||
/* P3 */ |
|||
sbit RD = 0xB7; |
|||
sbit WR = 0xB6; |
|||
sbit T1 = 0xB5; |
|||
sbit T0 = 0xB4; |
|||
sbit INT1 = 0xB3; |
|||
sbit INT0 = 0xB2; |
|||
sbit TXD = 0xB1; |
|||
sbit RXD = 0xB0; |
|||
|
|||
|
|||
///sfr AUXINTIF = 0xef;
|
|||
|
|||
#define T2IF 0x01 |
|||
#define INT4IF BITN6 |
|||
#define INT3IF BITN5 |
|||
#define INT2IF BITN4 |
|||
|
|||
//#define T4IF BITN2
|
|||
//#define T3IF BITN1
|
|||
//#define T2IF BITN0
|
|||
|
|||
|
|||
/// >>>>> add by cc
|
|||
|
|||
#include "../clib/bit.h" |
|||
|
|||
#define D_stdIO_P0_ALL() P0M1=0;P0M0=0; |
|||
#define D_HighI_P0_ALL() P0M1=0;P0M0=0XFF; |
|||
#define D_HighR_P0_ALL() P0M1=0XFF;P0M0=0; |
|||
#define D_OpenD_P0_ALL() P0M1=0XFF;P0M0=0XFF; |
|||
|
|||
#define D_stdIO_P1_ALL() P1M1=0;P1M0=0; |
|||
#define D_HighI_P1_ALL() P1M1=0;P1M0=0XFF; |
|||
#define D_HighR_P1_ALL() P1M1=0XFF;P1M0=0; |
|||
#define D_OpenD_P1_ALL() P1M1=0XFF;P1M0=0XFF; |
|||
|
|||
|
|||
#define D_stdIO_P0(BITNx) BITN_0(P0M1,BITNx);BITN_0(P0M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS
|
|||
#define D_HighI_P0(BITNx) BITN_0(P0M1,BITNx);BITN_1(P0M0,BITNx); //////01 推挽输出 20mA 加限流
|
|||
#define D_HighR_P0(BITNx) BITN_1(P0M1,BITNx);BITN_0(P0M0,BITNx); /////////10 高阻
|
|||
#define D_OpenD_P0(BITNx) BITN_1(P0M1,BITNx);BITN_1(P0M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
|
|||
|
|||
#define D_stdIO_P1(BITNx) BITN_0(P1M1,BITNx);BITN_0(P1M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS
|
|||
#define D_HighI_P1(BITNx) BITN_0(P1M1,BITNx);BITN_1(P1M0,BITNx); //////01 推挽输出 20mA 加限流
|
|||
#define D_HighR_P1(BITNx) BITN_1(P1M1,BITNx);BITN_0(P1M0,BITNx); /////////10 高阻
|
|||
#define D_OpenD_P1(BITNx) BITN_1(P1M1,BITNx);BITN_1(P1M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
|
|||
|
|||
#define D_stdIO_P2(BITNx) BITN_0(P2M1,BITNx);BITN_0(P2M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS
|
|||
#define D_HighI_P2(BITNx) BITN_0(P2M1,BITNx);BITN_1(P2M0,BITNx); //////01 推挽输出 20mA 加限流
|
|||
#define D_HighR_P2(BITNx) BITN_1(P2M1,BITNx);BITN_0(P2M0,BITNx); /////////10 高阻
|
|||
#define D_OpenD_P2(BITNx) BITN_1(P2M1,BITNx);BITN_1(P2M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
|
|||
|
|||
#define D_stdIO_P3(BITNx) BITN_0(P3M1,BITNx);BITN_0(P3M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS
|
|||
#define D_HighI_P3(BITNx) BITN_0(P3M1,BITNx);BITN_1(P3M0,BITNx); //////01 推挽输出 20mA 加限流
|
|||
#define D_HighR_P3(BITNx) BITN_1(P3M1,BITNx);BITN_0(P3M0,BITNx); /////////10 高阻
|
|||
#define D_OpenD_P3(BITNx) BITN_1(P3M1,BITNx);BITN_1(P3M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
|
|||
|
|||
#define D_stdIO_P4(BITNx) BITN_0(P4M1,BITNx);BITN_0(P4M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS
|
|||
#define D_HighI_P4(BITNx) BITN_0(P4M1,BITNx);BITN_1(P4M0,BITNx); //////01 推挽输出 20mA 加限流
|
|||
#define D_HighR_P4(BITNx) BITN_1(P4M1,BITNx);BITN_0(P4M0,BITNx); /////////10 高阻
|
|||
#define D_OpenD_P4(BITNx) BITN_1(P4M1,BITNx);BITN_1(P4M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
|
|||
|
|||
#define D_stdIO_P5(BITNx) BITN_0(P5M1,BITNx);BITN_0(P5M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS
|
|||
#define D_HighI_P5(BITNx) BITN_0(P5M1,BITNx);BITN_1(P5M0,BITNx); //////01 推挽输出 20mA 加限流
|
|||
#define D_HighR_P5(BITNx) BITN_1(P5M1,BITNx);BITN_0(P5M0,BITNx); /////////10 高阻
|
|||
#define D_OpenD_P5(BITNx) BITN_1(P5M1,BITNx);BITN_1(P5M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
|
|||
|
|||
#define D_stdIO_P6(BITNx) BITN_0(P6M1,BITNx);BITN_0(P6M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS
|
|||
#define D_HighI_P6(BITNx) BITN_0(P6M1,BITNx);BITN_1(P6M0,BITNx); //////01 推挽输出 20mA 加限流
|
|||
#define D_HighR_P6(BITNx) BITN_1(P6M1,BITNx);BITN_0(P6M0,BITNx); /////////10 高阻
|
|||
#define D_OpenD_P6(BITNx) BITN_1(P6M1,BITNx);BITN_1(P6M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
|
|||
|
|||
#define D_stdIO_P7(BITNx) BITN_0(P7M1,BITNx);BITN_0(P7M0,BITNx); //////00 准双向口 灌电流20mA 拉电流270-150uS
|
|||
#define D_HighI_P7(BITNx) BITN_0(P7M1,BITNx);BITN_1(P7M0,BITNx); //////01 推挽输出 20mA 加限流
|
|||
#define D_HighR_P7(BITNx) BITN_1(P7M1,BITNx);BITN_0(P7M0,BITNx); /////////10 高阻
|
|||
#define D_OpenD_P7(BITNx) BITN_1(P7M1,BITNx);BITN_1(P7M0,BITNx); /////11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
|
|||
|
|||
/***
|
|||
|
|||
#define P0_conf_in(n) BITN_1(P0M1,n);BITN_0(P0M0,n); |
|||
#define P1_conf_in(n) BITN_1(P1M1,n);BITN_0(P1M0,n); |
|||
#define P2_conf_in(n) BITN_1(P2M1,n);BITN_0(P2M0,n); |
|||
#define P2_conf_port(n) BITN_0(P2M1,n);BITN_0(P2M0,n); |
|||
|
|||
|
|||
#define P3_conf_in(n) BITN_1(P3M1,n);BITN_0(P3M0,n); |
|||
#define P3_conf_port(n) BITN_0(P3M1,n);BITN_0(P3M0,n); |
|||
|
|||
#define P4_conf_in(n) BITN_1(P4M1,n);BITN_0(P4M0,n); |
|||
#define P5_conf_in(n) BITN_1(P5M1,n);BITN_0(P5M0,n); |
|||
|
|||
***/ |
|||
|
|||
|
|||
|
|||
#define NOP() _nop_() |
|||
|
|||
#define L0_INT4_OPEN() BITN_1(INT_CLKO, INT_EX4) |
|||
#define L0_INT4_CLOSE() BITN_0(INT_CLKO, INT_EX4) |
|||
|
|||
#define L0_INT4_AT() BITN_G(INT_CLKO, INT_EX4) |
|||
|
|||
|
|||
|
|||
|
|||
#define L0_INT4_CLEAR() BITN_0(AUXINTIF, INT4IF) |
|||
#define L0_INT3_CLEAR() BITN_0(AUXINTIF, INT3IF) |
|||
#define L0_INT2_CLEAR() BITN_0(AUXINTIF, INT2IF) |
|||
|
|||
|
|||
|
|||
|
|||
//////
|
|||
|
|||
#define L0_INT3_OPEN() BITN_1(INT_CLKO, INT_EX3); |
|||
#define L0_INT3_CLOSE() BITN_0(INT_CLKO, INT_EX3); |
|||
#define L0_INT2_OPEN() BITN_1(INT_CLKO, INT_EX2); |
|||
#define L0_INT2_CLOSE() BITN_0(INT_CLKO, INT_EX2); |
|||
#define L0_INT1_OPEN() EX1 = 1; |
|||
#define L0_INT1_CLOSE() EX1 = 0; |
|||
#define L0_INT0_OPEN() EX0 = 1; |
|||
#define L0_INT0_CLOSE() EX0 = 0; |
|||
|
|||
#if 0 |
|||
#define L0_TIMER1_start() TR1 = 1; |
|||
#define L0_TIMER1_end() TR1 = 0; |
|||
|
|||
|
|||
#define L0_TIMER1_isr_OPEN() ET1 = 1; |
|||
#define L0_TIMER1_isr_CLOSE() ET1 = 0; |
|||
|
|||
|
|||
#else |
|||
|
|||
#define L0_TIMER1_start() ET1 = 1; |
|||
#define L0_TIMER1_end() ET1 = 0; |
|||
|
|||
|
|||
#define L0_TIMER1_isr_OPEN() TR1 = 1; |
|||
#define L0_TIMER1_isr_CLOSE() TR1 = 0; |
|||
|
|||
|
|||
#endif |
|||
|
|||
/// fixme 颠倒定义会让c51锁死#define _nop_() NOP()
|
|||
|
|||
///#define L0_INT3_OPEN() BITN_1(INT_CLKO,INT_EX3); //使能INT3中断
|
|||
///#define L0_INT3_CLOSE() BITN_0(INT_CLKO,INT_EX3);
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
#endif //__STC_ONLY_H_
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
@ -0,0 +1,94 @@ |
|||
/*****************************************************************************
|
|||
* uart.h: Header file for NXP LPC17xx Family Microprocessors |
|||
* |
|||
* Copyright(C) 2017,SensorControl |
|||
* All rights reserved. |
|||
* |
|||
* History |
|||
* 2009.05.27 ver 1.00 Prelimnary version, first Release |
|||
*2017.01.10 ver 1.10 rename tick.h tick.c |
|||
******************************************************************************/ |
|||
#ifndef __tick_H |
|||
#define __tick_H |
|||
#include "../clib/Type.h" |
|||
#include "../msp/time.h" |
|||
|
|||
struct _s_nos_tick_ |
|||
{ |
|||
vU32 jiffies; // noos系统定时器最小计时单元
|
|||
vU32 t_1s; |
|||
vU8 t1s_heatbeart; //noos 系统定时器整秒时刻标志,需要软件清除
|
|||
// vU8 t_10ms;
|
|||
}; |
|||
extern struct _s_nos_tick_ s_nos_tick; |
|||
|
|||
#if(TYPE_JIFFIES_5MS == D_sys_Jiffies) |
|||
#define HZ 200 |
|||
#elif(TYPE_JIFFIES_10MS == D_sys_Jiffies) |
|||
#define HZ 100 |
|||
#elif(TYPE_JIFFIES_25MS == D_sys_Jiffies) |
|||
#define HZ 40 |
|||
#endif |
|||
#define JIFFIES (1000/HZ) |
|||
|
|||
#define D_sys_now (s_nos_tick.jiffies) |
|||
//D_sys_delay_msec以jiffies为最小计时单位,jiffies是10ms为例,参数n=12ms时,最终延时了20ms
|
|||
#define D_sys_delay_msec(n) do{ \ |
|||
if(n>0) \ |
|||
{ \ |
|||
U32 mstmp = D_sys_now; \ |
|||
while(D_sys_now - mstmp < (((n)-1)/JIFFIES) + 1); \ |
|||
} \ |
|||
}while(0) |
|||
|
|||
#define D_Tdelay_Msec(n) (((n)-1) / JIFFIES + 1) |
|||
#define D_Tdelay_Sec(n) (((n)*1000-1) /JIFFIES + 1) |
|||
#define D_Tdelay_5ms ((5-1) / JIFFIES + 1) |
|||
#define D_Tdelay_10ms ((10-1) / JIFFIES + 1) |
|||
#define D_Tdelay_20ms ((20-1) / JIFFIES + 1) |
|||
#define D_Tdelay_50ms ((50-1) / JIFFIES + 1) |
|||
|
|||
#define D_Tdelay_100ms ((100-1) / JIFFIES + 1) |
|||
#define D_Tdelay_200ms ((200-1) / JIFFIES+ 1) |
|||
#define D_Tdelay_300ms ((300-1) / JIFFIES + 1) |
|||
#define D_Tdelay_400ms ((400-1) / JIFFIES + 1) |
|||
#define D_Tdelay_500ms ((500-1) / JIFFIES + 1) |
|||
|
|||
#define D_Tdelay_1s (1 * HZ) |
|||
#define D_Tdelay_2s (2 * HZ) |
|||
#define D_Tdelay_3s (3 * HZ) |
|||
#define D_Tdelay_4s (4 * HZ) |
|||
#define D_Tdelay_5s (5 * HZ) |
|||
#define D_Tdelay_10s (10 * HZ) |
|||
#define D_Tdelay_15s (15 * HZ) |
|||
|
|||
#define D_Tdelay_1min (1 * 60 * HZ) |
|||
#define D_Tdelay_10min (10 * 60 * HZ) |
|||
#define D_Tdelay_1h (60 * 60 * HZ) |
|||
#define D_Tdelay_1day (24 * 60 * 60 * HZ) |
|||
|
|||
|
|||
//必须配对
|
|||
#define L0_nos_tick10ms_start(start_n) start_n = s_nos_tick.t_50ms |
|||
#define L0_nos_tick10ms_interval(start_n) (s_nos_tick.t_50ms - start_n) |
|||
|
|||
|
|||
#define L0_nos_tick1s_start(start_n) start_n = s_nos_tick.t_1s |
|||
#define L0_nos_tick1s_interval(start_n) (s_nos_tick.t_1s - start_n) |
|||
|
|||
|
|||
//>>>//必须配对
|
|||
#define L2_tick_time_stamp(time_stamp) time_stamp = s_nos_tick.t_50ms; |
|||
#define L2_tick_time_interval(time_stamp,time_overflow) (( s_nos_tick.t_50ms - time_stamp) > time_overflow) |
|||
|
|||
|
|||
#define L3_tick_interval(x) L2_tick_time_interval(s_nos_tick.n_stamp,x) |
|||
#define L2_tick_stamp() L2_tick_time_stamp(s_nos_tick.n_stamp); |
|||
|
|||
extern void L1_tick_init(void); |
|||
extern void L1_tick_tick (void); |
|||
|
|||
#endif /* end __tick_H */ |
|||
/*****************************************************************************
|
|||
** End Of File |
|||
******************************************************************************/ |
@ -0,0 +1,187 @@ |
|||
//////////////////////////////////////////////////////////////////////////
|
|||
/// COPYRIGHT NOTICE
|
|||
/// Copyright (c) 2015, 传控科技
|
|||
/// All rights reserved.
|
|||
///
|
|||
/// @file main.c
|
|||
/// @brief main app
|
|||
///
|
|||
///(本文件实现的功能的详述)
|
|||
///
|
|||
/// @version 1.1 CCsens technology
|
|||
/// @author CC
|
|||
/// @date 20150102
|
|||
///
|
|||
///
|
|||
/// 修订说明:最初版本
|
|||
/// Modified by:
|
|||
/// Modified date:
|
|||
/// Version:
|
|||
/// Descriptions:
|
|||
// 20160413 CC-ACC-VH02
|
|||
// 连接至 J22 RXD0 TXD0
|
|||
//P5_DIR &= ~BITN1; //p5.1输出TXD
|
|||
//P5_DIR |= BITN0; //p5.0输入RXD
|
|||
//P5_SEL0 &= ~(BITN0 +BITN1); //设置P5.0 P5.1为UART0 RXD TXD
|
|||
//P5_SEL1 |= BITN0 +BITN1;
|
|||
|
|||
/*****************************************************************************
|
|||
update by cc @201700110 |
|||
针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 |
|||
个需要平衡的事情. |
|||
|
|||
clib/clib.c: |
|||
公用的函数 和硬件无关 |
|||
放置串行模式(串口等其他通讯总线类的输出)输出的函数, |
|||
一些覆盖模式输出的(lcd等固屏输出的)的也可使用 |
|||
void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) |
|||
----------------------------------------------------------------------------------------- |
|||
uartcom/Uprotocol2app |
|||
协议到应用 |
|||
为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 |
|||
|
|||
typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ |
|||
L3_UARTcom0_exp_protocol 解析应用协议 |
|||
----------------------------------------------------------------------------------------- |
|||
uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 |
|||
公用的串口通讯定义 |
|||
struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ |
|||
void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 |
|||
-------------------------------------------------------------------------------------------- |
|||
msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 |
|||
L0_UART0_Init |
|||
UART0_IRQHandler |
|||
L0_Usend_uc------UserDef |
|||
----------------------------------------------------------------------------------------- |
|||
********************************************************************************/ |
|||
#include "msp_uart0.h" |
|||
#include "../msp/time.h" |
|||
//#define _USE_485
|
|||
|
|||
static volatile Ts_uart_send_buf idata ts_uart_send_shop; |
|||
|
|||
TP_Handler_X s_uart0_rec; |
|||
TS_PH4_modbus s_uart0_ack; |
|||
|
|||
void L0_uart0_init(void) |
|||
{ |
|||
// U16 val1= D_BRT_COUNT(12,D_sys_MainFre,D_uart0_BRT);
|
|||
// SCON = 0x50; //8位数据,可变波特率
|
|||
// AUXR |= 0x01; //串口1选择定时器2为波特率发生器
|
|||
// AUXR &= 0xFB; //定时器2时钟为Fosc/12,即12T
|
|||
// T2L = val1;
|
|||
// T2H = val1 >> 8;
|
|||
// AUXR |= 0x10; //启动定时器2
|
|||
SCON = 0x50; //8位数据,可变波特率
|
|||
AUXR &= 0xBF; //定时器时钟12T模式
|
|||
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
|
|||
TMOD &= 0x0F; //设置定时器模式
|
|||
TL1 = 0xFC; //设置定时初始值
|
|||
TH1 = 0xFF; //设置定时初始值
|
|||
//// TL1 = val1; //设置定时初始值
|
|||
//// TH1 = val1 >> 8; //设置定时初始值
|
|||
ET1 = 0; //禁止定时器%d中断
|
|||
TR1 = 1; //定时器1开始计时
|
|||
// SCON = 0x50; //8位数据,可变波特率
|
|||
// AUXR |= 0x01; //串口1选择定时器2为波特率发生器
|
|||
// AUXR &= 0xFB; //定时器时钟12T模式
|
|||
// T2L = 0xE8; //设置定时初始值
|
|||
// T2H = 0xFF; //设置定时初始值
|
|||
// AUXR |= 0x10; //定时器2开始计时
|
|||
} |
|||
|
|||
void L0_uart0_buf_init(void) |
|||
{ |
|||
ts_uart[uNum0].p = &ts_uart_send_shop; |
|||
ts_uart[uNum0].p->max = ts_uart[uNum0].p->now = 0; |
|||
ts_uart[uNum0].p->ok = D_ready; |
|||
ts_uart[uNum0].t = &s_uart0_rec; |
|||
ts_uart[uNum0].t->head = 0; |
|||
ts_uart[uNum0].t->ok = 0; |
|||
//ts_uart[uNum0].tp_handler = L1_s2b_PH4;
|
|||
ts_uart[uNum0].tp_handler = NULL; //使用函数指针导致错误
|
|||
ts_uart[uNum0].ack = (U8*)&s_uart0_ack; |
|||
L0_uart0_init(); |
|||
D_uart0_ES_INT(1); //打开串口中断
|
|||
|
|||
#if (D_UART0_485_TYPE != TYPE_485_NONE) |
|||
D_UART0_485_RX() //默认处于接收状态
|
|||
#endif |
|||
} |
|||
|
|||
void L0_uart0_sendArray(U8 * buf, U16 len) |
|||
{ |
|||
#if (D_UART0_485_TYPE != TYPE_485_NONE) |
|||
D_UART0_485_TX() //切换到输出状态
|
|||
#endif |
|||
L0_uartN_sendArray(uNum0,buf,len); |
|||
} |
|||
|
|||
/*************************************************
|
|||
UART 中断 |
|||
*************************************************/ |
|||
void INTERRUPT_UART(void) D_SERVE_UART |
|||
{ |
|||
//NOP(); NOP(); NOP();
|
|||
if(L0_uart0_IntRI()) //如果是U0接收中断
|
|||
{ |
|||
// LED0 ^= 1;
|
|||
L0_uart0_IntRIClear(); //清除接收中断标志
|
|||
ts_uart[uNum0].t->reg = SBUF; |
|||
//ts_uart[uNum0].tp_handler(ts_uart[uNum0].t);
|
|||
L1_s2b_PH4(ts_uart[uNum0].t); |
|||
L0_timer3_restart(); |
|||
} |
|||
if(L0_uart0_IntTI()) //如果是U0发送中断
|
|||
{ |
|||
//LED0 ^= 1;
|
|||
L0_uart0_IntTIClear(); //清除发送中断标志
|
|||
if(ts_uart[uNum0].p->max != ts_uart[uNum0].p->now) |
|||
{ |
|||
SBUF = ts_uart[uNum0].p->p[ts_uart[uNum0].p->now]; |
|||
//L0_uartN_set(uNum0,ts_uart[uNum0].p->p[ts_uart[uNum0].p->now]);
|
|||
ts_uart[uNum0].p->now ++; |
|||
} |
|||
else |
|||
{ |
|||
ts_uart[uNum0].p->ok = D_ready; |
|||
ts_uart[uNum0].p->max = 0; |
|||
ts_uart[uNum0].p->now = 0;//可以发送下一个数据
|
|||
#if (D_UART0_485_TYPE != TYPE_485_NONE) |
|||
D_UART0_485_RX() //切换到接收状态
|
|||
#endif |
|||
} |
|||
} |
|||
//NOP(); NOP(); NOP();
|
|||
} |
|||
#if 0 |
|||
void timer3_isrHanddle(void) D_SERVE_TIMER3 |
|||
{ |
|||
struct _tp_handler_x *p1 = &s_uart0_rec; |
|||
if((p1->head == 1) && (p1->num >= D_s_modbus_min)) |
|||
{ |
|||
p1->head = 0; |
|||
crc16_irq(p1->crc,p1->buf,p1->num - 2); //校验CRC
|
|||
if(p1->crc[0] == p1->buf[p1->num-2] && p1->crc[1] == p1->buf[p1->num-1]) |
|||
{ |
|||
p1->ok = 1; |
|||
// LED0 ^= 1;
|
|||
} |
|||
else |
|||
{ |
|||
p1->yes = 1; |
|||
} |
|||
} |
|||
|
|||
L0_timer3_stop(); |
|||
} |
|||
#endif |
|||
//putchar字符发送函数重定向
|
|||
extern char putchar(char c) |
|||
{ |
|||
///PrintData1(c);
|
|||
L0_uart0_sendArray(&c,1); |
|||
return c; |
|||
} |
|||
|
|||
|
@ -0,0 +1,183 @@ |
|||
//////////////////////////////////////////////////////////////////////////
|
|||
/// COPYRIGHT NOTICE
|
|||
/// Copyright (c) 2015, 传控科技
|
|||
/// All rights reserved.
|
|||
///
|
|||
/// @file main.c
|
|||
/// @brief main app
|
|||
///
|
|||
///(本文件实现的功能的详述)
|
|||
///
|
|||
/// @version 1.1 CCsens technology
|
|||
/// @author CC
|
|||
/// @date 20150102
|
|||
///
|
|||
///
|
|||
/// 修订说明:最初版本
|
|||
/// Modified by:
|
|||
/// Modified date:
|
|||
/// Version:
|
|||
/// Descriptions:
|
|||
// 20160413 CC-ACC-VH02
|
|||
// 连接至 J22 RXD0 TXD0
|
|||
//P5_DIR &= ~BITN1; //p5.1输出TXD
|
|||
//P5_DIR |= BITN0; //p5.0输入RXD
|
|||
//P5_SEL0 &= ~(BITN0 +BITN1); //设置P5.0 P5.1为UART0 RXD TXD
|
|||
//P5_SEL1 |= BITN0 +BITN1;
|
|||
|
|||
/*****************************************************************************
|
|||
update by cc @201700110 |
|||
针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 |
|||
个需要平衡的事情. |
|||
|
|||
clib/clib.c: |
|||
公用的函数 和硬件无关 |
|||
放置串行模式(串口等其他通讯总线类的输出)输出的函数, |
|||
一些覆盖模式输出的(lcd等固屏输出的)的也可使用 |
|||
void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) |
|||
----------------------------------------------------------------------------------------- |
|||
uartcom/Uprotocol2app |
|||
协议到应用 |
|||
为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 |
|||
|
|||
typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ |
|||
L3_UARTcom0_exp_protocol 解析应用协议 |
|||
----------------------------------------------------------------------------------------- |
|||
uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 |
|||
公用的串口通讯定义 |
|||
struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ |
|||
void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 |
|||
-------------------------------------------------------------------------------------------- |
|||
msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 |
|||
L0_UART0_Init |
|||
UART0_IRQHandler |
|||
L0_Usend_uc------UserDef |
|||
----------------------------------------------------------------------------------------- |
|||
********************************************************************************/ |
|||
#include "msp_uart2.h" |
|||
#include "../app/app_config.h" |
|||
#include "../msp/time.h" |
|||
|
|||
//#define _USE_485
|
|||
|
|||
static volatile Ts_uart_send_buf idata ts_uart2_send_shop; |
|||
//TP_Handler_X s_uart2_rec;
|
|||
//TS_PH4_modbus s_uart2_ack;
|
|||
struct _s_PC1_0D0A_ s_uart2_at; |
|||
TS_Handle_PH3 s_uart2_tcp_rec; |
|||
void (*Lp0_uart2_fun)(unsigned char sbufreg); |
|||
|
|||
void L0_uart2_init(void) |
|||
{ |
|||
S2CON = 0x50; //8位数据,可变波特率
|
|||
AUXR &= 0xFB; //定时器时钟12T模式
|
|||
T2L = 0xFC; //设置定时初始值
|
|||
T2H = 0xFF; //设置定时初始值
|
|||
AUXR |= 0x10; //定时器2开始计时
|
|||
} |
|||
|
|||
void L0_uart2_buf_init(void) |
|||
{ |
|||
s_uart2_at.head = 0; |
|||
s_uart2_at.ok = 0; |
|||
s_uart2_at.num = 0; |
|||
|
|||
ts_uart[uNum2].p = &ts_uart2_send_shop; |
|||
ts_uart[uNum2].p->now = 0; |
|||
ts_uart[uNum2].p->ok = D_ready; |
|||
//ts_uart[uNum2].t = &s_uart2_rec;
|
|||
ts_uart[uNum2].t->head = 0; |
|||
ts_uart[uNum2].t->ok = 0; |
|||
ts_uart[uNum2].tp_handler = NULL; |
|||
//ts_uart[uNum2].ack = (U8*)&s_uart2_ack;
|
|||
L0_uart2_init(); |
|||
D_uart2_ES_INT(1); //打开串口中断
|
|||
|
|||
|
|||
//配置串口对应的操作协议
|
|||
L1_uart_tpc_config(); |
|||
|
|||
#if (D_UART2_485_TYPE != TYPE_485_NONE) |
|||
D_UART2_485_RX() //默认处于接收状态
|
|||
#endif |
|||
} |
|||
|
|||
void L0_uart2_sendArray(U8 * buf, U16 len) |
|||
{ |
|||
#if (D_UART2_485_TYPE != TYPE_485_NONE) |
|||
D_UART2_485_TX() //切换到输出状态
|
|||
#endif |
|||
L0_uartN_sendArray(uNum2,buf,len); |
|||
} |
|||
void L1_s2b_gm35(unsigned char sbufreg) |
|||
{ |
|||
s_uart2_tcp_rec.reg = sbufreg; |
|||
L1_s2b_PH3(&s_uart2_tcp_rec); |
|||
if(0 == s_uart2_tcp_rec.head) |
|||
{ |
|||
s_uart2_at.reg = sbufreg; |
|||
L1_s2b_0d0a(&s_uart2_at); |
|||
} |
|||
else |
|||
{ |
|||
s_uart2_at.head = 0; |
|||
} |
|||
} |
|||
void L1_uart_tpc_config(void) |
|||
{ |
|||
s_uart2_tcp_rec.head = 0; |
|||
s_uart2_tcp_rec.ok = 0; |
|||
s_uart2_tcp_rec.head_0 = D_CMD_Filter1_ff; |
|||
s_uart2_tcp_rec.head_1 = D_CMD_Filter2_fe; |
|||
s_uart2_tcp_rec.sp = (U8*)&(s_uart2_tcp_rec.ts_ccmodbus); |
|||
} |
|||
|
|||
/*************************************************
|
|||
UART 中断 |
|||
*************************************************/ |
|||
///#define D_SERVE_uart2 interrupt 8
|
|||
void INTERRUPT_uart2(void) interrupt 8 ///D_SERVE_uart2// using 2
|
|||
{ |
|||
//NOP(); NOP(); NOP();
|
|||
if(L0_uart2_IntRI()) //如果是U2接收中断
|
|||
{ |
|||
//LED1 ^= 1;
|
|||
L0_uart2_IntRIClear(); //清除接收中断标志
|
|||
//ts_uart[uNum2].t->reg = L0_uartN_get(uNum2);
|
|||
//ts_uart[uNum2].tp_handler(ts_uart[uNum2].t);
|
|||
//s_uart2_at.reg = L0_uartN_get(uNum2);
|
|||
//L1_s2b_0d0a(&s_uart2_at);
|
|||
L1_s2b_gm35(L0_uart2_get()); |
|||
} |
|||
if(L0_uart2_IntTI()) //如果是U0发送中断
|
|||
{ |
|||
L0_uart2_IntTIClear(); //清除发送中断标志
|
|||
if(ts_uart[uNum2].p->max != ts_uart[uNum2].p->now) |
|||
{ |
|||
S2BUF = ts_uart[uNum2].p->p[ts_uart[uNum2].p->now]; |
|||
//L0_uartN_set(uNum2,ts_uart[uNum2].p->p[ts_uart[uNum2].p->now]);
|
|||
ts_uart[uNum2].p->now ++; |
|||
} |
|||
else |
|||
{ |
|||
ts_uart[uNum2].p->ok = D_ready; |
|||
ts_uart[uNum2].p->max = 0; |
|||
ts_uart[uNum2].p->now = 0;//可以发送下一个数据
|
|||
#if (D_UART2_485_TYPE != TYPE_485_NONE) |
|||
D_UART2_485_RX() //切换到接收状态
|
|||
#endif |
|||
|
|||
} |
|||
} |
|||
//NOP(); NOP(); NOP();
|
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
@ -0,0 +1,94 @@ |
|||
//////////////////////////////////////////////////////////////////////////
|
|||
/// COPYRIGHT NOTICE
|
|||
/// Copyright (c) 2015, 传控科技
|
|||
/// All rights reserved.
|
|||
///
|
|||
/// @file main.c
|
|||
/// @brief main app
|
|||
///
|
|||
///(本文件实现的功能的详述)
|
|||
///
|
|||
/// @version 1.1 CCsens technology
|
|||
/// @author CC
|
|||
/// @date 20150102
|
|||
///
|
|||
///
|
|||
/// 修订说明:最初版本
|
|||
/// Modified by:
|
|||
/// Modified date:
|
|||
/// Version:
|
|||
/// Descriptions:
|
|||
//////////////////////////////////////////////////////////////////////////
|
|||
/*****************************************************************************
|
|||
update by cc @201700110 |
|||
针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 |
|||
个需要平衡的事情. |
|||
|
|||
clib/clib.c: |
|||
公用的函数 和硬件无关 |
|||
放置串行模式(串口等其他通讯总线类的输出)输出的函数, |
|||
一些覆盖模式输出的(lcd等固屏输出的)的也可使用 |
|||
void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) |
|||
----------------------------------------------------------------------------------------- |
|||
uartcom/Uprotocol2app |
|||
协议到应用 |
|||
为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 |
|||
|
|||
typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ |
|||
L3_UARTcom0_exp_protocol 解析应用协议 |
|||
----------------------------------------------------------------------------------------- |
|||
uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 |
|||
公用的串口通讯定义 |
|||
struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ |
|||
void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 |
|||
-------------------------------------------------------------------------------------------- |
|||
msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 |
|||
L0_uart2_Init |
|||
uart2_IRQHandler |
|||
L0_Usend_uc------UserDef |
|||
----------------------------------------------------------------------------------------- |
|||
********************************************************************************/ |
|||
|
|||
|
|||
#ifndef _uart2_H |
|||
#define _uart2_H |
|||
|
|||
#include "../bsp/bsp_config.h" |
|||
|
|||
#include "../tpc/at0d0a.h" |
|||
#include "../tpc/modbus.h" |
|||
#include "msp_uart_x.h" |
|||
#include "../tpc/ccmodbus.h" |
|||
|
|||
#define uNum2 1 |
|||
|
|||
#define D_uart2_ES_INT(x) (x) ? (BITN_1(IE2,ES2)) : (BITN_0(IE2,ES2)) |
|||
#define L0_uart2_IntRI() (S2CON & S2RI)//BITN_G(SCON,U0RI)
|
|||
#define L0_uart2_IntTI() (S2CON & S2TI)//BITN_G(SCON,U0TI)
|
|||
#define L0_uart2_IntRIClear(); BITN_0(S2CON,S2RI) |
|||
#define L0_uart2_IntTIClear(); BITN_0(S2CON,S2TI) |
|||
#define L0_uart2_get() (S2BUF) |
|||
|
|||
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
|||
|
|||
void L0_uart2_buf_init(void); |
|||
void L0_uart2_sendArray(U8 * buf, U16 len); |
|||
void uart2_Handdle(void); |
|||
#define L0_uart2_uc(X) L0_uartN_uc(uNum2,X) |
|||
#define L0_uart2_us(X) L0_uartN_us(uNum2,X) |
|||
#define L0_uart2_ul(X) L0_uartN_ul(uNum2,X) |
|||
#define L0_uart2_0d0a() L0_uartN_0d0a(0) |
|||
#define L0_uart2_uchex(X) L0_uartN_uchex(uNum2,X) |
|||
#define L0_uart2_ushex(X) L0_uartN_ushex(uNum2,X) |
|||
#define L0_uart2_ulhex(X) L0_uartN_ulhex(uNum2,X) |
|||
#define L0_uart2_sendstr(buf) L0_uartN_sendstr(uNum2,buf) |
|||
//extern TP_Handler_X s_uart2_rec;
|
|||
//extern TS_PH4_modbus s_uart2_ack;
|
|||
extern TS_Handle_0d0a s_uart2_at; |
|||
extern TS_Handle_PH3 s_uart2_tcp_rec; |
|||
extern void (*Lp0_uart2_fun)(unsigned char sbufreg); |
|||
|
|||
extern void L1_uart_tpc_config(void); |
|||
|
|||
#endif //#ifndef _uart2_H
|
|||
|
@ -0,0 +1,236 @@ |
|||
//////////////////////////////////////////////////////////////////////////
|
|||
/// COPYRIGHT NOTICE
|
|||
/// Copyright (c) 2015, 传控科技
|
|||
/// All rights reserved.
|
|||
///
|
|||
/// @file main.c
|
|||
/// @brief main app
|
|||
///
|
|||
///(本文件实现的功能的详述)
|
|||
///
|
|||
/// @version 1.1 CCsens technology
|
|||
/// @author CC
|
|||
/// @date 20150102
|
|||
///
|
|||
///
|
|||
/// 修订说明:最初版本
|
|||
/// Modified by:
|
|||
/// Modified date:
|
|||
/// Version:
|
|||
/// Descriptions:
|
|||
// 20160413 CC-ACC-VH02
|
|||
// 连接至 J22 RXD0 TXD0
|
|||
//P5_DIR &= ~BITN1; //p5.1输出TXD
|
|||
//P5_DIR |= BITN0; //p5.0输入RXD
|
|||
//P5_SEL0 &= ~(BITN0 +BITN1); //设置P5.0 P5.1为UART0 RXD TXD
|
|||
//P5_SEL1 |= BITN0 +BITN1;
|
|||
|
|||
/*****************************************************************************
|
|||
update by cc @201700110 |
|||
针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 |
|||
个需要平衡的事情. |
|||
|
|||
clib/clib.c: |
|||
公用的函数 和硬件无关 |
|||
放置串行模式(串口等其他通讯总线类的输出)输出的函数, |
|||
一些覆盖模式输出的(lcd等固屏输出的)的也可使用 |
|||
void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) |
|||
----------------------------------------------------------------------------------------- |
|||
uartcom/Uprotocol2app |
|||
协议到应用 |
|||
为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 |
|||
|
|||
typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ |
|||
L3_UARTcom0_exp_protocol 解析应用协议 |
|||
----------------------------------------------------------------------------------------- |
|||
uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 |
|||
公用的串口通讯定义 |
|||
struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ |
|||
void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 |
|||
-------------------------------------------------------------------------------------------- |
|||
msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面idata |
|||
L0_UART0_Init |
|||
UART0_IRQHandler |
|||
L0_Usend_uc------UserDef |
|||
----------------------------------------------------------------------------------------- |
|||
********************************************************************************/ |
|||
#include "msp_uart_x.h" |
|||
|
|||
TS_uart_reg ts_uart[SERIAL_MAX_NUM] = {0}; |
|||
|
|||
void L0_uartN_set(U8 uartx,U8 x) |
|||
{ |
|||
switch(uartx) |
|||
{ |
|||
case 0:SBUF = (x);break; |
|||
case 1:S2BUF = (x);break; |
|||
case 2:S3BUF = (x);break; |
|||
case 3:S4BUF = (x);break; |
|||
default:break; |
|||
} |
|||
} |
|||
|
|||
U8 L0_uartN_get(U8 uartx) |
|||
{ |
|||
U8 x = 0; |
|||
switch(uartx) |
|||
{ |
|||
case 0:x = SBUF; break; |
|||
case 1:x = S2BUF;break; |
|||
case 2:x = S3BUF;break; |
|||
case 3:x = S4BUF;break; |
|||
default:break; |
|||
} |
|||
return x; |
|||
} |
|||
|
|||
void L0_waitFree_uartN(U8 uartx) |
|||
{ |
|||
ts_uart[uartx].p->over = 0; |
|||
while(ts_uart[uartx].p->ok != D_ready) |
|||
{ |
|||
#if 10 //发送数据特别快时,某些情况下会导致数据发送出错
|
|||
if(ts_uart[uartx].p->over ++ > 6000000) |
|||
{ |
|||
break; |
|||
} |
|||
#endif |
|||
} |
|||
} |
|||
|
|||
void L0_uartN_sendArray(U8 uartx,void *buf,U16 len) |
|||
{ |
|||
L0_waitFree_uartN(uartx); |
|||
ts_uart[uartx].p->ok = D_clear; |
|||
ts_uart[uartx].p->over = 0; |
|||
ts_uart[uartx].p->max = len; |
|||
ts_uart[uartx].p->now = 1; |
|||
if(len <= D_UART_send_buf_max) |
|||
{ |
|||
//将参数buf拷贝至内部buf
|
|||
for(ts_uart[uartx].p->num = 0;ts_uart[uartx].p->num < len;ts_uart[uartx].p->num ++) |
|||
{ |
|||
ts_uart[uartx].p->buf[ts_uart[uartx].p->num] = ((U8*)buf)[ts_uart[uartx].p->num]; |
|||
} |
|||
ts_uart[uartx].p->p = ts_uart[uartx].p->buf; |
|||
} |
|||
else |
|||
{ |
|||
//不使用内部buf,如果再发送完毕之前,参数buf被回收,发送会出错
|
|||
ts_uart[uartx].p->p = (U8 *)buf; |
|||
} |
|||
L0_uartN_set(uartx,ts_uart[uartx].p->p[0]); |
|||
} |
|||
|
|||
void L0_uartN_uc(U8 uartx,U8 ww) |
|||
{ |
|||
L0_uartN_sendArray(uartx,&ww,1); |
|||
} |
|||
|
|||
void L0_uartN_us(U8 uartx,vU16 ww) |
|||
{ |
|||
U_U16 uStemp; |
|||
uStemp.word = ww; |
|||
ts_uart[uartx].p->buf3[0] = uStemp.BYTE2.h; |
|||
ts_uart[uartx].p->buf3[1] = uStemp.BYTE2.l; |
|||
L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,2); |
|||
} |
|||
|
|||
void L0_uartN_ul(U8 uartx,vU32 ww) |
|||
{ |
|||
U_U32 uStemp; |
|||
L0_waitFree_uartN(uartx); |
|||
uStemp.dWord = ww; |
|||
ts_uart[uartx].p->buf3[0] = uStemp.BYTE4.byte0; |
|||
ts_uart[uartx].p->buf3[1] = uStemp.BYTE4.byte1; |
|||
ts_uart[uartx].p->buf3[2] = uStemp.BYTE4.byte2; |
|||
ts_uart[uartx].p->buf3[3] = uStemp.BYTE4.byte3; |
|||
L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,4); |
|||
} |
|||
|
|||
void L0_uartN_0d0a(U8 uartx) |
|||
{ |
|||
L0_waitFree_uartN(uartx); |
|||
ts_uart[uartx].p->buf3[0] = 0x0d; |
|||
ts_uart[uartx].p->buf3[1] = 0x0a; |
|||
L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,2); |
|||
} |
|||
|
|||
void L0_uartN_uchex(U8 uartx,U8 ww) |
|||
{ |
|||
L0_waitFree_uartN(uartx); |
|||
ts_uart[uartx].p->buf3[0] = cguHex2Char[D_uc_high(ww)][1]; |
|||
ts_uart[uartx].p->buf3[1] = cguHex2Char[D_uc_low (ww)][1]; |
|||
L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,2); |
|||
} |
|||
|
|||
void L0_uartN_ushex(U8 uartx,vU16 ww) |
|||
{ |
|||
U_F16 k; |
|||
L0_waitFree_uartN(uartx); |
|||
k.us = ww; |
|||
ts_uart[uartx].p->buf3[0] = cguHex2Char[D_uc_high(k.BYTE2.H)][1]; |
|||
ts_uart[uartx].p->buf3[1] = cguHex2Char[D_uc_low (k.BYTE2.H)][1]; |
|||
ts_uart[uartx].p->buf3[2] = cguHex2Char[D_uc_high(k.BYTE2.L)][1]; |
|||
ts_uart[uartx].p->buf3[3] = cguHex2Char[D_uc_low (k.BYTE2.L)][1]; |
|||
L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,4); |
|||
} |
|||
|
|||
void L0_uartN_ulhex(U8 uartx,U32 ww) |
|||
{ |
|||
U_U32 k; |
|||
L0_waitFree_uartN(uartx); |
|||
k.dWord = ww; |
|||
ts_uart[uartx].p->buf3[0] = cguHex2Char[D_uc_high(k.BYTE4.byte0)][1]; |
|||
ts_uart[uartx].p->buf3[1] = cguHex2Char[D_uc_low (k.BYTE4.byte0)][1]; |
|||
ts_uart[uartx].p->buf3[2] = cguHex2Char[D_uc_high(k.BYTE4.byte1)][1]; |
|||
ts_uart[uartx].p->buf3[3] = cguHex2Char[D_uc_low (k.BYTE4.byte1)][1]; |
|||
ts_uart[uartx].p->buf3[4] = cguHex2Char[D_uc_high(k.BYTE4.byte2)][1]; |
|||
ts_uart[uartx].p->buf3[5] = cguHex2Char[D_uc_low (k.BYTE4.byte2)][1]; |
|||
ts_uart[uartx].p->buf3[6] = cguHex2Char[D_uc_high(k.BYTE4.byte3)][1]; |
|||
ts_uart[uartx].p->buf3[7] = cguHex2Char[D_uc_low (k.BYTE4.byte3)][1]; |
|||
L0_uartN_sendArray(uartx,ts_uart[uartx].p->buf3,8); |
|||
} |
|||
|
|||
void L0_uartN_sendstr(U8 uartx,U8 *str) |
|||
{ |
|||
L0_uartN_sendArray(uartx,str,Lc_strlen(str)); |
|||
} |
|||
|
|||
void L0_uartN_uchexArray(U8 uartx,vU8 *buf,U16 n) |
|||
{ |
|||
int i; |
|||
for(i=0;i<n;i++) |
|||
{ |
|||
L0_uartN_uchex(uartx,buf[i]); |
|||
L0_uartN_uc(uartx,' '); |
|||
} |
|||
L0_uartN_0d0a(uartx); |
|||
} |
|||
|
|||
void L1_uartN_uchexArray(U8 uartx,vU8 *buf,U16 n) |
|||
{ |
|||
int i; |
|||
for(i=0;i<n;i++) |
|||
{ |
|||
L0_uartN_uchex(uartx,buf[i]); |
|||
L0_uartN_uc(uartx,' '); |
|||
} |
|||
L0_uartN_0d0a(uartx); |
|||
} |
|||
#if 0 |
|||
这样的好处是效率高 缺点是空间大 |
|||
void L1_uartN_uchexArray(U8 uartx,U8 *buf,U16 len) |
|||
{ |
|||
D_485_TX(); //切换到输出状态
|
|||
if(len >= D_UART_send_buf_max) |
|||
{ |
|||
len = D_UART_send_buf_max - 1; |
|||
|
|||
} |
|||
Lc_hex2ascii(ts_uart[uartx].p->bufhex,buf,len); |
|||
L0_uartN_sendArray(uartx,ts_uart[uartx].p->bufhex,len*3); |
|||
} |
|||
|
|||
#endif |
|||
|
@ -0,0 +1,184 @@ |
|||
//////////////////////////////////////////////////////////////////////////
|
|||
/// COPYRIGHT NOTICE
|
|||
/// Copyright (c) 2015, 传控科技
|
|||
/// All rights reserved.
|
|||
///
|
|||
/// @file main.c
|
|||
/// @brief main app
|
|||
///
|
|||
///(本文件实现的功能的详述)
|
|||
///
|
|||
/// @version 1.1 CCsens technology
|
|||
/// @author CC
|
|||
/// @date 20150102
|
|||
///
|
|||
///
|
|||
/// 修订说明:最初版本
|
|||
/// Modified by:
|
|||
/// Modified date:
|
|||
/// Version:
|
|||
/// Descriptions:
|
|||
// 20160413 CC-ACC-VH02
|
|||
// 连接至 J22 RXD0 TXD0
|
|||
//P5_DIR &= ~BITN1; //p5.1输出TXD
|
|||
//P5_DIR |= BITN0; //p5.0输入RXD
|
|||
//P5_SEL0 &= ~(BITN0 +BITN1); //设置P5.0 P5.1为UART0 RXD TXD
|
|||
//P5_SEL1 |= BITN0 +BITN1;
|
|||
|
|||
/*****************************************************************************
|
|||
update by cc @201700110 |
|||
针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 |
|||
个需要平衡的事情. |
|||
|
|||
clib/clib.c: |
|||
公用的函数 和硬件无关 |
|||
放置串行模式(串口等其他通讯总线类的输出)输出的函数, |
|||
一些覆盖模式输出的(lcd等固屏输出的)的也可使用 |
|||
void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) |
|||
----------------------------------------------------------------------------------------- |
|||
uartcom/Uprotocol2app |
|||
协议到应用 |
|||
为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 |
|||
|
|||
typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ |
|||
L3_UARTcom0_exp_protocol 解析应用协议 |
|||
----------------------------------------------------------------------------------------- |
|||
uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 |
|||
公用的串口通讯定义 |
|||
struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ |
|||
void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 |
|||
-------------------------------------------------------------------------------------------- |
|||
msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 |
|||
L0_UART0_Init |
|||
UART0_IRQHandler |
|||
L0_Usend_uc------UserDef |
|||
----------------------------------------------------------------------------------------- |
|||
********************************************************************************/ |
|||
#include "../msp/msp_uart3.h" |
|||
#include "../msp/time.h" |
|||
#include <stdio.h> |
|||
|
|||
static volatile Ts_uart_send_buf idata ts_uart3_send_shop; |
|||
struct _tp_handler_x s_uart3_rec; |
|||
TS_PH4_modbus s_uart3_ack; |
|||
|
|||
void L0_uart3_init(void) |
|||
{ |
|||
//#if(MainFre_11M == D_sys_MainFre) //115200bps@11.0592MHz
|
|||
// S3CON = 0x10; //8位数据,可变波特率
|
|||
// S3CON |= 0x40; //串口3选择定时器3为波特率发生器
|
|||
// T4T3M |= 0x02; //定时器3时钟为Fosc,即1T
|
|||
// T3L = 0xE8; //设定定时初值
|
|||
// T3H = 0xFF; //设定定时初值
|
|||
// T4T3M |= 0x08; //启动定时器3
|
|||
|
|||
//#elif (MainFre_22M == D_sys_MainFre) //115200bps@22.1184MHz
|
|||
// S3CON = 0x10; //8位数据,可变波特率
|
|||
// S3CON |= 0x40; //串口3选择定时器3为波特率发生器
|
|||
// T4T3M |= 0x02; //定时器3时钟为Fosc,即1T
|
|||
// T3L = 0xD0; //设定定时初值
|
|||
// T3H = 0xFF; //设定定时初值
|
|||
// T4T3M |= 0x08; //启动定时器3
|
|||
//#endif
|
|||
#if 0
|
|||
S3CON = 0x10; //8位数据,可变波特率
|
|||
S3CON &= 0xBF; //串口3选择定时器2为波特率发生器
|
|||
AUXR |= 0x04; //定时器时钟1T模式
|
|||
T2L = 0xD0; //设置定时初始值
|
|||
T2H = 0xFF; //设置定时初始值
|
|||
AUXR |= 0x10; //定时器2开始计时
|
|||
#endif |
|||
//512000
|
|||
S3CON = 0x10; //8位数据,可变波特率
|
|||
S3CON |= 0x40; //串口3选择定时器3为波特率发生器
|
|||
T4T3M &= 0xFD; //定时器时钟12T模式
|
|||
T3L = 0xFF; //设置定时初始值
|
|||
T3H = 0xFF; //设置定时初始值
|
|||
T4T3M |= 0x08; //定时器3开始计时
|
|||
} |
|||
|
|||
void L0_uart3_buf_init(void) |
|||
{ |
|||
ts_uart[uNum3].p = &ts_uart3_send_shop; |
|||
ts_uart[uNum3].p->now = 0; |
|||
ts_uart[uNum3].p->ok = D_ready; |
|||
ts_uart[uNum3].t = &s_uart3_rec; |
|||
ts_uart[uNum3].t->head = 0; |
|||
ts_uart[uNum3].t->ok = 0; |
|||
ts_uart[uNum3].tp_handler = L1_s2b_PH4; |
|||
ts_uart[uNum3].ack = (U8*)&s_uart3_ack; |
|||
L0_uart3_init(); |
|||
//D_uart3_ES_INT_OPEN(); //打开串口中断
|
|||
D_uart3_ES_INT(1); //打开串口中断
|
|||
|
|||
#if (D_UART3_485_TYPE != TYPE_485_NONE) |
|||
D_UART3_485_RX() //默认处于接收状态
|
|||
#endif |
|||
} |
|||
|
|||
void L0_uart3_sendArray(U8 * buf, U16 len) |
|||
{ |
|||
//#if (D_UART3_485_TYPE != TYPE_485_NONE)
|
|||
// D_UART3_485_TX() //切换到输出状态
|
|||
//#endif
|
|||
L0_uartN_sendArray(uNum3,buf,len); |
|||
} |
|||
|
|||
/*************************************************
|
|||
UART 中断 |
|||
*************************************************/ |
|||
#define D_SERVE_UART3 interrupt 17 |
|||
void INTERRUPT_UART3(void) D_SERVE_UART3// using 3
|
|||
{ |
|||
NOP(); NOP(); NOP(); |
|||
if(L0_uart3_IntRI()) //如果是U0接收中断
|
|||
{ |
|||
L0_uart3_IntRIClear(); //清除接收中断标志
|
|||
ts_uart[uNum3].t->reg = L0_uartN_get(uNum3); |
|||
ts_uart[uNum3].tp_handler(ts_uart[uNum3].t); |
|||
//L0_timer4_start();
|
|||
} |
|||
if(L0_uart3_IntTI()) |
|||
{ |
|||
if(L0_uart3_IntTI()) //如果是U0发送中断
|
|||
{ |
|||
L0_uart3_IntTIClear(); //清除发送中断标志
|
|||
if(ts_uart[uNum3].p->max != ts_uart[uNum3].p->now) |
|||
{ |
|||
L0_uartN_set(uNum3,ts_uart[uNum3].p->p[ts_uart[uNum3].p->now]); |
|||
ts_uart[uNum3].p->now ++; |
|||
} |
|||
else |
|||
{ |
|||
ts_uart[uNum3].p->ok = D_ready; |
|||
ts_uart[uNum3].p->max = 0; |
|||
ts_uart[uNum3].p->now = 0;//可以发送下一个数据
|
|||
#if (D_UART3_485_TYPE != TYPE_485_NONE) |
|||
D_UART3_485_RX() //切换到接收状态
|
|||
#endif |
|||
} |
|||
} |
|||
} |
|||
NOP(); NOP(); NOP(); |
|||
} |
|||
|
|||
void timer4_isrHanddle(void) D_SERVE_TIMER4 |
|||
{ |
|||
struct _tp_handler_x *p = &s_uart3_rec; |
|||
if((p->head == 1) && (p->num >= D_s_modbus_min)) |
|||
{ |
|||
p->head = 0; |
|||
crc16(p->crc,p->buf,p->num - 2); //校验CRC
|
|||
if(p->crc[0] == p->buf[p->num-2] && p->crc[1] == p->buf[p->num-1]) |
|||
{ |
|||
if(p->ok == 0) |
|||
{ |
|||
p->ok = 1; |
|||
} |
|||
} |
|||
//LED0 ^= 1;
|
|||
} |
|||
L0_timer4_stop(); |
|||
} |
|||
|
|||
|
@ -0,0 +1,93 @@ |
|||
//////////////////////////////////////////////////////////////////////////
|
|||
/// COPYRIGHT NOTICE
|
|||
/// Copyright (c) 2015, 传控科技
|
|||
/// All rights reserved.
|
|||
///
|
|||
/// @file main.c
|
|||
/// @brief main app
|
|||
///
|
|||
///(本文件实现的功能的详述)
|
|||
///
|
|||
/// @version 1.1 CCsens technology
|
|||
/// @author CC
|
|||
/// @date 20150102
|
|||
///
|
|||
///
|
|||
/// 修订说明:最初版本
|
|||
/// Modified by:
|
|||
/// Modified date:
|
|||
/// Version:
|
|||
/// Descriptions:
|
|||
//////////////////////////////////////////////////////////////////////////
|
|||
/*****************************************************************************
|
|||
update by cc @201700110 |
|||
针对多串口 和 单一串口 有区别 每个串口是独立的还是分开的有讲究 程序是复杂的还是软件应用简单是 |
|||
个需要平衡的事情. |
|||
|
|||
clib/clib.c: |
|||
公用的函数 和硬件无关 |
|||
放置串行模式(串口等其他通讯总线类的输出)输出的函数, |
|||
一些覆盖模式输出的(lcd等固屏输出的)的也可使用 |
|||
void Lc_print(void (*L0pf_send_uc)(char ww), char *dat,...) |
|||
----------------------------------------------------------------------------------------- |
|||
uartcom/Uprotocol2app |
|||
协议到应用 |
|||
为了适应不同的通讯协议需要不同的uart口来对应 和应用相关 |
|||
|
|||
typedef struct _ts_lcm_pro_; 应用协议包的定义? LCM的协议------------ |
|||
L3_UARTcom0_exp_protocol 解析应用协议 |
|||
----------------------------------------------------------------------------------------- |
|||
uartcom/urec2protocol: 接收到的数据放入到指向特定协议的缓存中,和协议的格式有关 一般分为 标头式或者标尾式 |
|||
公用的串口通讯定义 |
|||
struct _s_uart_rec_ 的公共协议包(关键的结构体)的声明------struct _s_uart_rec_ |
|||
void L1_uart_2buf(struct _s_uart_rec_ *p)串行数据保存到指向特定协议的缓冲中 |
|||
-------------------------------------------------------------------------------------------- |
|||
msp/uartx.c 底层代码 和cpu相关 缓存发送也放在里面 |
|||
L0_uart3_Init |
|||
uart3_IRQHandler |
|||
L0_Usend_uc------UserDef |
|||
----------------------------------------------------------------------------------------- |
|||
********************************************************************************/ |
|||
|
|||
|
|||
#ifndef _uart3_H |
|||
#define _uart3_H |
|||
|
|||
#include "../bsp/bsp_config.h" |
|||
#include "../tpc/modbus.h" |
|||
#include "msp_uart_x.h" |
|||
|
|||
#define uNum3 2 |
|||
|
|||
//#define S4SM0 BITN7
|
|||
#define D_uart3_ES_INT(x) (x) ? (BITN_1(IE2,ES3)) : (BITN_0(IE2,ES3)) |
|||
//#define D_uart3_ES_INT_CLOSE() BITN_0(IE2,ES3)
|
|||
//#define D_uart3_ES_INT_OPEN() BITN_1(IE2,ES3)
|
|||
#define L0_uart3_IntRI() (S3CON & S3RI)//BITN_G(SCON,U0RI)
|
|||
#define L0_uart3_IntTI() (S3CON & S3TI)//BITN_G(SCON,U0TI)
|
|||
#define L0_uart3_IntRIClear(); BITN_0(S3CON,S3RI) |
|||
#define L0_uart3_IntTIClear(); BITN_0(S3CON,S3TI) |
|||
#define L0_uart3_set(x) S3BUF = (x); |
|||
#define L0_uart3_get() (S3BUF) |
|||
|
|||
|
|||
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
|||
|
|||
extern void L0_uart3_buf_init(void); |
|||
extern void L0_uart3_sendArray(U8 * buf, U16 len); |
|||
|
|||
#define L0_uart3_uc(X) L0_uartN_uc(uNum3,X) |
|||
#define L0_uart3_us(X) L0_uartN_us(uNum3,X) |
|||
#define L0_uart3_ul(X) L0_uartN_ul(uNum3,X) |
|||
#define L0_uart3_0d0a() L0_uartN_0d0a(uNum3) |
|||
#define L0_uart3_uchex(X) L0_uartN_uchex(uNum3,X) |
|||
#define L0_uart3_ushex(X) L0_uartN_ushex(uNum3,X) |
|||
#define L0_uart3_ulhex(X) L0_uartN_ulhex(uNum3,X) |
|||
#define L0_uart3_sendstr(buf) L0_uartN_sendstr(uNum3,buf) |
|||
#define L1_uart3_uchexArray(buf) L1_uartN_uchexArray(uNum3,buf) |
|||
|
|||
extern TP_Handler_X s_uart3_rec; |
|||
extern TS_PH4_modbus s_uart3_ack; |
|||
|
|||
#endif //#ifndef _uart3_H
|
|||
|
Loading…
Reference in new issue