|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2011-11-13 00:30:51
|
显示全部楼层
回复【33楼】wolwc3891
lz 能否把你的sccb协议部分分享一下。我的无法写入寄存器
-----------------------------------------------------------------------
~AVR IO模拟的,跟iic差不多。。。几个小函数~
//////////////////////////////////////////////////////////////SCCB
//初始化模拟SCCB接口
void InitSCCB(void)
{
SCCB_DDR|=(1<<SCCB_SIO_C)|(1<<SCCB_SIO_D);
SCCB_PORT|=(1<<SCCB_SIO_C)|(1<<SCCB_SIO_D);
}
//start命令,SCCB的起始信号
void startSCCB(void)
{
SIO_D_SET; //数据线高电平
delay_us(100);
SIO_C_SET; //在时钟线高的时候数据线由高至低
delay_us(100);
SIO_D_CLR;
delay_us(100);
SIO_C_CLR; //数据线恢复低电平,单操作函数必要
delay_us(100);
}
//stop命令,SCCB的停止信号
void stopSCCB(void)
{
SIO_D_CLR;
delay_us(100);
SIO_C_SET;
delay_us(100);
SIO_D_SET;
delay_us(100);
}
//noAck,用于连续读取中的最后一个结束周期
void noAck(void)
{
SIO_D_SET;
delay_us(100);
SIO_C_SET;
delay_us(100);
SIO_C_CLR;
delay_us(100);
SIO_D_CLR;
delay_us(100);
}
//写入一个字节的数据到SCCB
uchar SCCBwriteByte(uchar m_data)
{
unsigned char j,tem;
for(j=0;j<8;j++) //循环8次发送数据
{
if((m_data<<j)&0x80)
{
SIO_D_SET;
}
else
{
SIO_D_CLR;
}
delay_us(100);
SIO_C_SET;
delay_us(100);
SIO_C_CLR;
delay_us(100);
}
delay_us(100);
SIO_D_IN;/*设置SDA为输入*/
delay_us(100);
SIO_C_SET;
delay_us(1000);
if(SIO_D_STATE)
{
tem=0; //SDA=1发送失败,返回0
}
else
{
tem=1; //SDA=0发送成功,返回1
}
SIO_C_CLR;
delay_us(100);
SIO_D_OUT;/*设置SDA为输出*/
return(tem);
}
//一个字节数据读取并且返回
uchar SCCBreadByte(void)
{
unsigned char read,j;
read=0x00;
SIO_D_IN;/*设置SDA为输入*/
delay_us(100);
for(j=8;j>0;j--) //循环8次接收数据
{
delay_us(100);
SIO_C_SET;
delay_us(100);
read=read<<1;
if(SIO_D_STATE)
{
read=read+1;
}
SIO_C_CLR;
delay_us(100);
}
return(read);
} |
|