OTP单片机调试工具之—单线数据编码

OTP单片机调试工具在实现过程中离不开单线数据的传输,那么使用哪一种方式的数据编码会比较好呢?

我所了解的主要有以下三种:

1.UART(串口),这种方式在单片机和pc之间进行传输都非常常见,效率比较高,但是受标准波特率的条件限制,必须配合相应的晶体才能达到比较高的速率;其实要是单片机与单片机之前进行数据传输,那么可以无视标准波特率限制,可以自定义波特率。

这里用应广单片机为例,用应广的IDE可以生成通信代码。

/*这一段是通过宏定义和预编译,检测在当前时钟下,是否可以实现标准波特率通信*/

System_Clock => 8000000;

FPPA_Duty => _SYS(INC.FPPA_NUM); // Single FPPA = 1, Mult FPPA = 2 or 4/8/...

.errnz FPPA_Duty > 2 // Only for 1 /2 FPPA, not for more FPPAs

Baud_Rate => 115200;

/*

UART_Delay => (System_Clock / FPPA_Duty) / Baud_Rate;

if System_Clock = 8,000.000 Hz

FPPA_Duty = /16

so FPPA_Clock = System_Clock / FPPA_Duty = 500.000 Hz

if Baud_Rate = 19200

so UART_Delay = 500.000 / 19200 = 26.0416...

so match, 26 cycles send one bit. < 0.5%

if Baud_Rate = 38400

so UART_Delay = 500.000 / 38400 = 13.02083...

so match, 13 cycles send one bit. < 0.5%

if Baud_Rate = 56000

? so UART_Delay = 500.000 / 56000 = 8.9285... < 1.0%

if Baud_Rate = 57600

X so UART_Delay = 500.000 / 57600 = 8.6805... : fail

*/

UART_Delay => ( (System_Clock / FPPA_Duty) + (Baud_Rate/2) ) / Baud_Rate;

// + (Baud_Rate/2) : to round up or down

Test_V0 => System_Clock / 1000 * 995;

Test_V1 => UART_Delay * Baud_Rate * FPPA_Duty;

Test_V2 => System_Clock / 1000 * 1005;

#if (Test_V1 < Test_V0) || (Test_V1 > Test_V2)

.echo %Test_V0 <= %Test_V1 <= %Test_V2

.error Baud_Rate do not match to System Clock

#endif

UART_Out BIT PB.0;

UART_In BIT PB.1;

/*实际发送代码*/

static void UART_Send (void)

{

BYTE cnt;

BYTE UART_Data_Out;

UART_Data_Out = A;

// Start Bit

set0 UART_Out; // 1

#if FPPA_Duty == 1

cnt = 8; // 2 ~ 3

.Delay 3; // 4 ~ 6

do

{ // Data Bit * 8

.Delay UART_Delay - 10;

sr UART_Data_Out; // 7

if (CF)

{

nop; // 10

UART_Out = 1; // 1

}

else

{

UART_Out = 0; // 1

.delay 2; // 2 ~ 3

}

} while (--cnt); // 4 ~ 6

.Delay UART_Delay - 5;

#else

.Delay UART_Delay - 4;

cnt = 8; // 2 ~ 3

// Data Bit * 8

do

{

sr UART_Data_Out; // 4 4

swapc UART_Out; // 1

.Delay UART_Delay - 4;

} while (--cnt); // 2, 3

.Delay 2; // 3 ~ 4

#endif

// Stop Bit

set1 UART_Out; // 1

.Delay 2 * UART_Delay - 2;

} // 2

主要是为了能够适配标准波特率,看起来代码不少,实际核心代码不多。如果是自定义波特率,那么会简单很多,只要是时序对得上就好了。这种方式的好处就是效率比较高,但是要求收发双方要时钟同步。

2,使用类1-wire总线协议,实现方式如下

/*1wire 发送*/

void Wire1_Send_Byte(void)

{

byte ucCnt;

ucCnt=8;

while(ucCnt)

{

/*起始位*/

UART_Tx=1;

/*移位*/

src UartTxBuf;

/*根据需要传输的数据输出对应电平*/

swapc UART_Tx;

.delay 6;

/*输出低电平*/

UART_Tx=0;

ucCnt--;

}

}

这种方式是使用了归零码,这种方式的好处就是能够自同步,方便接端进行解码。但是效率不高

3.使用红外遥控编码,其实这种方式和上述类单总线方式很相像,感觉好像是高低电平反过来就是了。

发送实现方式:用这个Wire1_Send_Byte()代码改一下就好了。

以上就是3种常见的单线数据传输方式,可以根据实际需要,选择其中一种方式作为数据传输使用。感谢!

相关推荐
成都纵横智控科技官方账号2 天前
EG82088串口边缘计算网关
串口·边缘计算·边缘计算网关·plc网关
zhongvv4 天前
OTP单片机调试工具之—应广单片机ADC调试案例
嵌入式硬件·应广单片机·adc采样·otp调试·串口数据显示
Joshua.X7 天前
电脑总显示串口正在被占用处理方法
嵌入式硬件·串口·信息与通信·故障排查·232·485
wmq1631 个月前
嵌入式经常用到串口,如何判断串口数据接收完成?
单片机·串口
BreezeJuvenile2 个月前
STM32调试手段:重定向printf串口
stm32·单片机·串口·printf重定向
BreezeJuvenile2 个月前
USART_串口通讯轮询案例(HAL库实现)
stm32·单片机·串口·hal库开发
BreezeJuvenile2 个月前
STM32之USART_串口通讯
stm32·单片机·串口
Yuri X-20213 个月前
串口通信标准RS232、RS422、RS485有什么区别和不同
串口·通讯·rs232·rs485·rs422
夜间去看海3 个月前
67 基于单片机的温湿度、烟雾、阈值切换、状态灯、串口收发
单片机·嵌入式硬件·串口·温湿度·状态灯