SMBus总线是怎么产生中断的?

SMBus总线是怎么产生中断的?,第1张

SMBus的中断源比较多,我们一般在中断服务函数里面去判断,然后做出相应的响应,你去看看PDF,就会比较清楚

我前段时间调试了这种总线,与时钟芯片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、选好了就点击下一步,电脑自动会安装驱动直到完成安装,完成后就可以了!我们在看看设备管理器里没有黄色感叹号了吧。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7967079.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-12
下一篇 2023-04-12

发表评论

登录后才能评论

评论列表(0条)

保存