我用nrf24l01进行无线通信,第一次和我预料的一样,没成功,自然很是郁闷。无线电看不见摸不着,不知如何调试,这东西是不是坏了,我都不知道。后来,我想出一个注意:写寄存器,再读寄存器,若读出来的值与写入的值一样(若两个值是一样,就让一个指定的LED亮),就证明这两部操作都是正确的。而对这些芯片的操作无非就是由读和写构成的。我按照这种思路,对nrf24l01的所有寄存器,依次进行读写,我很欣慰,我可以把值写进去,也可以读出来相同的值,器件是好的。
这个方法让我兴奋了一天,因为我可以窥见他们的心脏。这个方法也有点不足,就是不全面,一次只能显示一个寄存器。我想在同一时间显示所有寄存器,该如何呢?我实现了,方法为把寄存器的值依次读出,然后依次通过串口上传至PC,显示在串口调试助手中。程序不是很难写,关键两点。第一、波特率要正确,而且误差要小。我用的晶振是12M,若用9600则误差是6.98%,误差相当大,在串口上显示的都是乱码,汉字都出来了。注:发送和接受都要以字符方式,不要勾选HEX选项。
![]() 我把单片机的波特率设置成4800 SMOD = 1; 误差只有0.16,我发现SMOD =1波特率倍增后,误差明显减小。例如4800 SMOD =0;误差有7%之多。
![]() ![]() 单片机的波特率可以设置,PC的波特率当然更能设置了,在设备管理器里找到串口,右击属性,有个选项就是更改波特率的,还可以该名字,例如把COM1变成COM9.另一点是把整型变成字符串,因为串口调试助手是通过字符串来显示的,HEX的你能看懂吗?把整数 0X3A 变成"0X3A",需要一点技巧,我把程序贴出来
void send_char(uchar x){
SBUF = x; while(!TI); _nop_(); TI = 0; } void send_str(uchar *s) {
uchar i = 0; while(s[i] != '\0') { SBUF = s[i]; while(!TI); _nop_(); TI = 0; i++; }} void send_nu(uchar c)
{ uchar low,high; low = c & 0x0f; high = _cror_(c,4); high = high & 0x0f; send_str(" 0x"); switch(high) { case 0: {send_char(48);break;} case 1: {send_char(49);break;} case 2: {send_char(50);break;} case 3: {send_char(51);break;} case 4: {send_char(52);break;} case 5: {send_char(53);break;} case 6: {send_char(54);break;} case 7: {send_char(55);break;} case 8: {send_char(56);break;} case 9: {send_char(57);break;} case 10: {send_char(65);break;} case 11: {send_char(66);break;} case 12: {send_char(67);break;} case 13: {send_char(68);break;} case 14: {send_char(69);break;} case 15: {send_char(70);break;} } switch(low) { case 0: {send_char(48);break;} case 1: {send_char(49);break;} case 2: {send_char(50);break;} case 3: {send_char(51);break;} case 4: {send_char(52);break;} case 5: {send_char(53);break;} case 6: {send_char(54);break;} case 7: {send_char(55);break;} case 8: {send_char(56);break;} case 9: {send_char(57);break;} case 10: {send_char(65);break;} case 11: {send_char(66);break;} case 12: {send_char(67);break;} case 13: {send_char(68);break;} case 14: {send_char(69);break;} case 15: {send_char(70);break;} } } void send_nus(uchar *a,uchar len) { uchar i; for(i = 0;i<len;i++) { send_nu(a[i]); } } send_str("\r\nEN_AA =\t");
send_nu(0xa3);
send_str("\r\nEN_ADDR=\t"); // \r\n \t 等可以格式化显示
send_nu(0x35);
在串口调试助手中显示为
EN_AA = 0XA3
EN_ADDR = 0X35
程序不复杂,参考一下ASCII码表。
串口调试的时候,不要犯一些低级错误,第一步就是打开串口哦。若是乱码,八成是波特率没设置好,尤其是单片机方面。
|
|