电力通信的关键是如何保证在电力线上长距离的可靠通信。在电力线上通信存在以下问题:电力线间歇性噪声较大,信号衰减快,线路阴抗波动等。这些问题使电力线通信非常困难,电力线载波通信的关键是功能强大的电力线载波专门电路。
Intellon公司为适应这一形势发展的需要,设计出了基于电力线载波技术和各种网络接品控制器,例如SSCP300(具体参考手册)
SSCP300单片机的连接如图,用到的主要器件为单片机和SSCP300,单片机通过P0口的低四位口线与SSCP300相连接。
程序如下*******************************************************************************
应用 SSCP300 的难点在于对 SSCP300 内部寄存器的读写操作 ,因而在合理设计硬件电路的基础上 ,要充分了解 SSCP300 的数据读写控制逻辑 ,尤其是 SSCP300 本身所属网络的系统属性及自身配置信息 ,这里给出对 SSCP300 进行上电后初始化过程的代码。
*******************************************************************************
#include <reg51.h> // 引用标准库的头文件
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SCK = P0^0; // SPI时钟
sbit SI= P0^1; // SPI从器件数据输入
sbit SO = P0^2; // SPI从器件数据输出
sbit RST= P0^3; // 复位控制端
sbit CS = P0^4; // 片选端
sbit INT= P0^5; // SSCP300中断信号
uchar tbuf[7]={0,0,0,0,0,0,0,0}; // 写入配置代码存储缓冲区
uchar rbuf[7]={0,0,0,0,0,0,0,0}; // 读取配置代码存储缓冲区
#include<eg51.h>
#include<lic.h>
#define uchar unsigned char
#define uint unsigned int
uchar data
*******************************************************************************
51单片机通过SPI总线对SSCP300发送命令、数据读写程序
*******************************************************************************
void main()
{
P0=0xff;
CS=0;
delay(20); //延时20ms,SSCP300上电稳定复位
send(code=0x04) 读取sscp300接口状态
while(INT=0)
SCK=1;
state=read();
while(INT=0)
SCK=1;
if((state&01)=0x01) //中断标志位0
{
……
……
}
if((state&02)=0x02) //中断标志位1
{
……
……
}
if((state&04)=0x04) //中断标志位2
{
……
……
}
if((state&08)=0x08) //中断标志位3
{
……
……
}
if((state&10)=0x10) //中断标志位4
{
……
……
}
if((state&20)=0x20) //中断标志位5
{
……
……
}
if((state&40)=0x40) //中断标志位6
{
……
……
}
if((state&80)=0x80) //中断标志位7
{
……
……
}
}
//单片机开始对SSCP300配置
send(code=0x03) //发送命令03H
while(INT=0); //等待响应
for(i=0;i<7;i++)
{
send(code=tbuf[i++]); //连续发送7个字节
while(INT=0);
}
send(code=0x02) //发送命令02H
while(INT=0) //等待响应
for(i=0;i<7;i++)
{
rbuf[i++]=read(); //连续接收7个字节
while(INT=0);
}
for(i=0;i<7;i++)
{
if(rbuf=tbuf) //比较发送和接收到的数据
{
i++; //相等的话进行下一个数据的比较
}
return;
}
rst() //不相等,复位
}
//51单片机作为主机作为SPI主机接收一个字节数据
void read(void)
{
uchar temp
CS=0;
SCK=1; //时钟上升沿
for(i=0;i<8;i++)
{
SCK=0;
SCK=1; //时钟上升沿
if(SO=1)
{
temp=(temp︱0x01); //保存1
temp=(temp<<0x01);
}
else
{
temp=(temp︱0x00); //保存0
temp=(temp<<0x01);
}
}
return temp;
}
//51单片机作为主机发送,SSCP300接收一个字节数据
void send(uchar data)
{
uchar temp
temp=data;
CS=0; //片选控制
for(i=0;i<8;i++)
{
SCK=0;
if((data0&&0x80)!=0) //判断待发送数据位
{
SI=1; //发送‘1’
}
else
{
SI=0; //发送‘0’
}
delay(10) //延时稳定数据
SCK=1; //时钟上升沿
}
}
//SSCP300复位子程序
void rst()
{
send(code=0x01) //复位命令:01H
while(INT=0)
delay(20) //延时20ms,SSCP300稳定复位
SCK=1;
} |