五、工作原理
在I2C通信上,DSP为主控方,单片机为受控方。
在电源管理上,单片机是主控方,DSP是受控方。
由于采用一次性电池供电,要求电路必须具有较低的功耗,一方面,要在在单片机空闲的时候,降低工作频率。另一方面,让DSP只有在要工作的时候才供电,在空闲时掉电。以达到降低系统的功耗,延长电池使用寿命的目的。
(一)工作流程:
1 、单片机上电复位以后,完成系统的初始化。
2、 单片机通过IO口对DSP供电,DSP上电复为位,完成系统初始化。
3 、DSP在完成系统初始化以后,检测SPI_CTL的状态,如果是高电平,
则DSP根据工作模式配置相关参数。在配置完参数以后,发送“休眠就绪”
给单片机。如果检测到低电平,DSP则进入拍摄模式。
4、单片机接收到DSP的“休眠就绪”信号后,将DSP电源断电,同时将SPI_CTL
置低。
5、单片机每间隔一段时间, 对DSP上电并复位。将DSP激活,转入到步骤3。
(二)I2C总线概述:
I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,。各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程中,I2C总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于它所要完成的功能。CPU发出的控制信号分为地址码和控制量两部分,地址码用来选址,即接通需要控制的电路,确定控制的种类;控制量决定该调整的类别(如对比度、亮度等)及需要调整的量。这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。
I2C总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。
开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:SCL为低电平时,SDA由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。
(三)主控方DSP送信时序:
1、 发送START信号,在SCL高时,SDA从高变成低。
START程序结构如下(仅供参考):
void start( )
{
SDA=1;
SCL=1;
delay200s( );
SDA=0;
delay200s( );
SCL=0;
delay200s( );
}
2、发送数据字节结构如下(仅供参考):
uchar send_byte ( uchar byte)
{
uchar temp,uchar i,error;
temp=byte;
for(i=0;i<8;i++)
{
delay30us( ); //延时30Us。
if(temp&0x80) //提取位
{
SDA=1;
}
else
{
SDA=0;
}
SCL=1;
temp<<=1; //移位
delay30us( );
SCL=0;
}
delay30us( );
SDA_INPUT;
SCL=1; //检查应答信号
delay30us( );
ifSDA)
{
SCL=0;
delay30us( ); //答时返回1,
SDA_INPUT; //DA信号切换成输入。
retun 1;
}
else
{
SCL=0;
delay30us( );
return 0; //有应答返回0
}
3、 发送STOP停止信号。在SCL为高时,SDA从低到高。
void stop( )
{
delay( );
SCL=0;
SDA=0;
delay30us( );
SCL=1;
delay30us( );
SDA=1;
delay30us( );
}
(四)从机EM78P5480受信时序:
1、 检测START:
SPI_CTL输出低电平以后,单片机不停扫描MCU_SCL和MCU_SDA状态,当检测到MCU_SDA电平先从高到低跳变,MCU_SCL电平后从高到低跳变 认为这是一个Start信号。程序结构表达如下:
Start: while(MCU_SCL) //SCL 为1,
{
while(MCU_SDA); //SDA为1,等待
break; //SDA变为0,跳出
}
while(MCU_SCL); //等待SCL跳变为0
2、 接收数据:
在MCU_SCL从低电平跳到高电平的时候,单片机MCU_SDA进行采样, 延时15US后单片机再对MCU_SDA再次进行抽样,并比较2次采样的结果,如果2次结果相同,认为数据有效,如果第一次取样为高,第二次取样为低,认为 是START信号,如果第一次取样为低,第二次取样为高,则认为是STOP信号从而跳出循环,以避免接收错乱时单片机一直处于接受死循环状态。在接收到8位数据以后,单片机把MCU_SDA的方向切换为输出并输出低电平,以产生应答信号。MCU_SCL发出一个时钟脉冲以后,又把MCU_SDA的方向设置为输入,准备接收下一个字节的数据。接收一个字节数据的程序结构如下:
receive: for(i=0;i<8;i++)
{
while(!MCU_SCL) ; //等待SCL从0变为1
first_bit=MCU_SDA; //第一次采样给stop_bit
temp<<=1; //循环移位
nop( ); //延时
nop( );
nop( );
nop( );
nop( );
second_bit=MCU_SDA; //第二次采样
if(first_bit==second_bit) //前后一样
{
temp|=first_bit; //采样值给temp最低位
}
else if(first_bit==0) //接收到Stop信号。
{
reurn 1; //返回1主程序
}
else //检测到异常
{
return 0; //返回0 ,表示出错
}
while(MCU_SCL); //等待SCL从1变为0
}
while(!MCU_SCL); //等待MCU从0变为1
MCU_SDA_OUTPUT; //SDA设为输出。
MCU_SDA=0; //低电平,产生应答
nop( ); //延时保持
nop( );
nop( );
nop( );
nop( );
nop( );
while(MCU_SCL); //等待SCL从1变为0
MCU_SDA_INPUT; //SDA设为输入。
六、工作时序图
单片机通常工作在32.678khz的低速运行。
在检测到start信号以后,提升频率在3.58MHZ,高速运行。
在接收到一个数据包以后,又以32.678kHZ的速度运行。
为了使数据传输稳定,可靠,DSP作为主控方,必须等待足够充分的时间让单片机完成对时钟和数据的采样,当发送数据时检测到无应答或其他错误时,要发送停止信号并重新启动I2C发送失败的数据包。
单片机作为受控方:在检测到错误时,应立即退出接收状态,并把已接收的部分的数据舍弃,等待接收下一次的I2C总线启动信号。
信号时序图如下:
七、工作模式。
一共有四种工作模式:自动模式、手持保持模式、设置模式和测试模式。
这四种模式在一定条件下可以相互转换。 |