IICMDR配置

IICMDR配置,第1张

I2C配置

I2C调试检查:

1、检查I2C配置的相关内橡巧容,是否存在错误,或者漏配。

2、确保SDA和SCL所配置的GPIO没有被配置,否则会硬件配置出问题或者GPIO设置无效。

3、若I2C配置无误后,检查相关硬件问题,使用万用表测量I2C_SDA以及I2C_SCL的供电电压,如果与原理图中所示供电电压相差无几,则表示I2C供电电压没有问题。反之陵宽,则代表供电电压存在问题。

4、添加从设备,通过设备树来注册一个从设备,如果I2C总线正常工作,我们就可以创建一个从设备尺如亮驱动程序并注册到i2c总线上

你说的是IO模拟i2c吧,这个你参考下

#pragma ot(6,SIZE)

#define ERRORCOUNT 10

enum eepromtype {M2401,M2402,M2404,M2408,M2416,M2432,M2464,M24128,M24256}

enum eepromtype EepromType

/****************************** I2C总线 ******************************/

bit RW24XX(uchar *DataBuff,uchar ByteQuantity,uint Address,uchar ControlByte,enum eepromtype EepromType)

{

void Delay(uchar DelayCount)

void IICStart(void)

void IICStop(void)

bit IICRecAck(void)

void IICNoAck(void)

void IICAck(void)

uchar IICReceiveByte(void)

void IICSendByte(uchar sendbyte)

uchar data j,i = ERRORCOUNT

bit errorflag = 1

while (i--)

{

IICStart()

IICSendByte(ControlByte &0xfe)

if (IICRecAck())

continue

if (EepromType >M2416)

{

IICSendByte((uchar)(Address >>8))

if (IICRecAck())

continue

}

IICSendByte((uchar)Address)

if (IICRecAck())

continue

if (!(ControlByte &0x01))

{

j = ByteQuantity

errorflag = 0

while (j--)

{

IICSendByte(*DataBuff++)

if(!IICRecAck())

continue

errorflag = 1

break

}

if (errorflag==1)

continue

break

}

else

{

IICStart()

IICSendByte(ControlByte)

if (IICRecAck())

continue

while (--ByteQuantity)

{

*DataBuff++ = IICReceiveByte()

IICAck()

}

*DataBuff = IICReceiveByte() //read last byte data

IICNoAck()

errorflag = 0

break

}

}

IICStop()

if (!(ControlByte &0x01))

{

Delay(255)

Delay(255)

Delay(255)

Delay(255)

}

return(errorflag)

}

/***************** 启动总线 ********************/

void IICStart(void)

{

scl = 0

sda = 1

scl = 1

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

sda = 0

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

scl = 0

sda = 1

}

/***************** 停止IIC总线 ****************/

void IICStop(void)

{

scl = 0

sda = 0

scl = 1

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

sda = 1

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

scl = 0

}

/************** 检查应答位 *******************/

bit IICRecAck(void)

{

scl = 0

sda = 1

scl = 1

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

CY = sda//因为返回值总是放在CY中的

scl = 0

return(CY)

}

/*************** 对IIC总线产生应答 *******************/

void IICACK(void)

{

sda = 0

scl = 1

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

scl = 0

_nop_()

_nop_()

sda = 1

}

/***************** 不对IIC总线产生应答 ***************/

void IICNoAck(void)

{

sda = 1

scl = 1

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

scl = 0

}

/******************* 向IIC总线写数据 *********************/

void IICSendByte(uchar sendbyte)

{

uchar data j = 8

for (j >0j--)

{

scl = 0

sendbyte <<= 1 //无论C51怎样实现这个 *** 作,始终会使CY=sendbyte^7

sda = CY

scl = 1

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

_nop_()

}

scl = 0

}

/***************** 从IIC总线上读数据子程序 ******************/

uchar IICReceiveByte(void)

{

register receivebyte,i = 8

scl = 0

while (i--)

{

scl = 1

receivebyte = (receivebyte <<1) | sda

scl = 0

}

return(receivebyte)

}

/*************** 一个简单延时程序 ******************/

void Delay(uchar DelayCount)

{

while(DelayCount--)

}

void Delay_Msec(uchar t)

{

uchar i

while (t >0)

{

for (i = 0i <200i++)

{

WDT = 1

_nop_()

_nop_()

_nop_()

_nop_()

}

t--

}

}

/*************** 24C256读一个字节 *****************/

uchar Rd_24c256(uint beginbyte)

{

uchar data result

uchar i

EA = 0

i = RW24XX(&result,1,beginbyte,rd_24c256,M24256)

EA = 1

return(result)

}

/*************** 24C256写一个字节 ***************/

void Wr_24c256(uint address,uchar datum)

{

uchar i

EA = 0

i = RW24XX(&datum,1,address,wr_24c256,M24256)

Delay_Msec(10)

EA = 1

}


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

原文地址:https://54852.com/yw/8179000.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存