最近做课设,选了电力线通讯这种途径,经过百度google等一番查询,最终敲定了mi200e这块国产芯片。
课设要求就是双机通讯,互传传感器信息以及模拟一个时钟
然后淘宝买了拆机的成品,我拿回来把mcu拆了然后飞出通讯端口和stm8交互。现在串口两边可以通讯了,下一步就是重新绘制一块完整的pcb,然后制版,并实现响应功能。
先上ref:
http://search.eefocus.com/s?app_id=90&sub=1&q=mi200e
这是电路城搜索mi200e得出的结果,我主要参考第一篇,他在嘉立创还有发帖,点进去你就找得到了。
他使用stm8主控并绘制整块pcb,我则使用以前的stm8核心小板。由于mi200e常规供电为5v,稍稍更改核心板为5v供电做好。
没有拍当时做的图片,上pcb和实物吧!
将右图放大后,可看到两块绿板,这两块就是成品模块,应用于智能抄表的。可看到左边那块上有一根小跳线,跳线右边哪里原来是块u,我用烙铁把他拆了。
不然stm8没法单独和mi200e通讯。至于为什么要跳那根线,我在网上恰好查到他的原理图,(应该是miartech官方的方案,然后抄的,原件丝印不同),mi200e的供电vdd受一个pmos控制,
所以直接将mos的g级接地。其实我买了两种,一共买了四块,连运费20+rmb。另一种的丝印是和原理图队上的。我后面会附上手头的资料。
两块板子背面其实有排针,原来用于接220v的,我直接把他们并联在一起,然后接了一根电源线。一方面因为我电源线紧张,另一方面固定在一块纸板上方便调试。
这是原理图,通讯接口是SPI,其中cs不能直接接地,因为数据是双向互传,并且不是单次传输。具体参考SPI接口flash的cs为什么不能直接接地吧。
我一开始想省io直接接地,结果调试的时候发现,自检过不了。
至于rst引脚,我把它接到stm8的nrst恰好可以使用,虽然官方应用笔记里面说要低电平1s后拉高。留待后面再测试吧。
这样就是4个io就能交互了。
然后我按照嘉立创那篇帖子里的方案做了,然后一直调试,发现他的程序我直接用不了,数据通。
然后我发现省略了crc校验初步数据能够发送,但是有毛病。
没办法,又看手册,看应用笔记。以及对比另一个c51版本的程序
,这个程序从我给的链接里的第二篇可以下载到。但是这个只是驱动,应该就是这个产品用到的,但是没给全程序。我猜嘉立创那篇帖主
也是参考这个改的,因为驱动大体一致。我同时看笔记,以及两篇驱动,最后经过一番修改,然后下进去竟然就可以工作了。
程序限制它64字节,对于一般应用足够了。
说一下这块芯片的发送过程,两个引导字节(一个字),一个固定字节,然后配置字节(速率和字长,字为单位)。到这里都是固定200/240bps速率(会因交流电频率不同而不同),之后的速率可自行配置,
程序里设定的是1600/1920bps。然后是以字为单位的数据(这里就是串口透传,由于是字对齐,所以必须是偶数字节,这里要注意!),最后一个字的CRC校验。
附上一张笔记图,看别人的代码真是不容易啊。这里双向能通讯了,后面再看要不要他程序的框架,如果要,还有更多细节要明白。
和硬件打交道,如果不懂的话,可能就是一个延时你就要消耗大把时间。所以需要日积月累!
1 #include "stm8s.h" 2 #include "config.h" 3 #include "MI200E.h" 4 #include "PLCProcess.h" 5 6 unsigned char g_cStatusReg; 7 unsigned char g_cRecModCfgReg; 8 unsigned short PLC_Word_Rec_Overtime; 9 unsigned char g_bRecv_Pkg_Flag; 10 unsigned char g_CRC_H,g_CRC_L; 11 unsigned char g_cPkg_Length = 0; 12 unsigned char g_Pkg_Indication_Byte = 0; 13 unsigned char g_cTrans_Step; 14 unsigned char g_cRecv_Step; 15 unsigned char g_cRecByte_H; 16 unsigned char g_cRecByte_L; 17 unsigned char g_cSend_Data_Length; 18 unsigned char g_cSend_Byte_Cnt; 19 unsigned char g_cRecv_Byte_Cnt; 20 unsigned char g_Send_Buf[64]; 21 unsigned char g_Recv_Buf[64]; 22 23 24 void PLC_Send_Frame(unsigned char cWRData_H, unsigned char cWRData_L) 25 { 26 PLC_Write_Reg(PLCAddrWRSR,(g_cStatusReg&0x7F)); //Clear TI;Write Status Register:0x02 27 MI200E_SCK_0; 28 MI200E_CS_0; 29 Write_SPI(PLCAddrWRTB0); //Write Sending Byte Register 0:0x04 30 Write_SPI(cWRData_H); 31 Write_SPI(cWRData_L); 32 MI200E_SCK_0; 33 MI200E_CS_1; 34 } 35 36 void PLC_RD_Recv_Word(void) 37 { 38 MI200E_SCK_0; 39 MI200E_CS_0; 40 Write_SPI(PLCAddrRDRB0); //Read Receiving Byte Register 0:0x84 41 g_cRecByte_H =