我前段时间调试了这种总线,与时钟芯片PCF8563通讯就是这个
下面给你看看我写的服务程序
由于SMBus的特殊性,它要个超时检测,所以我把超时检测的服务程序也一共给你看看,这个是我调试成功的
如果还有什么建议,希望指正
QQ 247519442
/*************用于时钟芯片 *** 作的函数集****************/
//void write_pcf8563(void)写时钟芯片
//void read_pcf8563(void)读时钟芯片
/*****************************************************/
void write_pcf8563(uchar ADDseg)
{ TR0=0
SPI0CN &=~0x01 //暂时关闭SPI传送,防止产生不必要的干扰
SMBus_ReadControl=0//控制本次 *** 作是读(1)、还是写(0)寄存器
SMBus_Send_Seg_ADDR=1//是否要传送寄存器的地址(1为传送)
TARGET = pcf8563 //送子器件地址
Seg_ADDR = ADDseg //送要 *** 作的子器件寄存器地址
while(BUSY) //等待总线空闲
BUSY=1//占据数据总线
SMB_RW=0 //发送数据
STA=1//开始传送
while(BUSY)
SPI0CN |=0x01 //重新开启SPI
TR0=1
}
void read_pcf8563(uchar ADDseg) //读当时的时间
{
SPI0CN &=~0x01 //暂时关闭SPI传送,防止产生不必要的干扰
SMBus_ReadControl=1//控制本次 *** 作是读(1)、还是写(0)寄存器
SMBus_Send_Seg_ADDR=1//是否要传送寄存器的地址(1为传送)
TARGET = pcf8563 //送子器件地址
Seg_ADDR = ADDseg //送要 *** 作的子器件寄存器地址
while(BUSY) //等待总线空闲
BUSY=1
SMB_RW=0 //发送数据
STA=1
while(BUSY) //等待总线空闲(即等到传送数据结束)
SPI0CN |=0x01 //重新开启SPI
}
void SMBus_ISR (void) interrupt 7
{
bit FAIL = 0
bit SEND_START
if (ARBLOST == 0) //如果赢得总线
{
switch (SMB0CN &0xF0) //确定中断来源
{
case 0xe0://主发送方式下产生开始条件
SMB0DAT = TARGET
SMB0DAT &= 0xFE
SMB0DAT |= SMB_RW //对发送的数据进行处理
STA = 0
break
case 0xc0://主方式下发送
if (ACK)
{
if (SEND_START) //写完寄存器后控制再次发送
{
STA = 1
SEND_START = 0
break
}
if(SMBus_Send_Seg_ADDR) //是否要传送寄存器的地址
{
SMBus_Send_Seg_ADDR = 0
SMB0DAT = Seg_ADDR
if (SMBus_ReadControl) //控制本次 *** 作是读、还是写寄存器
{
SEND_START = 1
SMB_RW = 1
}
break
}
if (SMB_RW == 0)
{
if(send_receive_i<Send_Number)
{
SMB0DAT = send[send_receive_i]
send_receive_i++
}
else
{
send_receive_i=0
STO = 1
BUSY = 0
}
}
else {}
}
else //收到NACK信号的处理
{
STO = 1
STA = 1
}
break
case 0x80: //主方式下接收
if (send_receive_i<Receive_Number-1) //控制接收Receive_Number个数据就结束
{
receive[send_receive_i] = SMB0DAT
ACK = 1
send_receive_i++
}
else
{
receive[send_receive_i] = SMB0DAT
send_receive_i=0
BUSY = 0
ACK = 0
STO = 1
}
break
default:
FAIL = 1
break
}
}
else //输掉总线
{
FAIL = 1
}
if (FAIL) //SMBUS通讯失败后的处理
{
SMB0CF &= ~0x80
SMB0CF |= 0x80
STA = 0
STO = 0
ACK = 0
BUSY = 0
FAIL = 0
}
SI = 0
}
void T3_ISR() interrupt 14 //定时器3中断服务程序 用于检测SMBus是否超时
{
SMB0CF &= ~0x80
SMB0CF |= 0x80
TMR3CN &=~0x80
STA = 0
BUSY = 0
pcf8563_scl=1
}
1、点击我的电脑右键单击选属性-硬件-设备管理器,可以看到里面有黄色问号;2、点击有感叹号的标识-更新驱动程序-选从列表中指定位置安装-下一步-在搜索中包括这个位置里打钩;
3、点击浏览-选择你的驱动程序文件夹 选择SMBUS;
4、选好了就点击下一步,电脑自动会安装驱动直到完成安装,完成后就可以了!我们在看看设备管理器里没有黄色感叹号了吧。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)