AVR的I2C从机接收程序

AVR的I2C从机接收程序,第1张

你可以在AVR的单片机详细规范中查找伪代码,给你一段简单的例子吧

unsigned char i2cMasterReceiveNI(unsigned char deviceAddr, unsigned char length, unsigned char *data)

{

unsigned char retval = I2C_OK

// 关I2C中断

TWCR&=~(1<<TWIE)

//发送开始条件

i2cSendStart()

i2cWaitForComplete()

// 发送器件读地址

i2cSendByte( deviceAddr | 0x01 )

i2cWaitForComplete()

// 检查器件是否可用

if( TWSR == TW_MR_SLA_ACK){

// 接收数据并回应

while(length >1){

i2cReceiveByte(TRUE)

i2cWaitForComplete()

*data++ = i2cGetReceivedByte()

length--

}

// 接收数据无回应 (末位信号)

i2cReceiveByte(FALSE)

i2cWaitForComplete()

*data++ = i2cGetReceivedByte()

}else{

// 如未回应器件地址,停止发送,返回错误

retval = I2C_ERROR_NODEV

}

// 发送停止条件,保持TWEA以便从接收

i2cSendStop()

// 开I2C中断

TWCR|=TWIE

return retval

}

AT的没有具体去看他的daatsheep

一般的 24都是允许一次性全部读出的只要你的时序没有问题

另外ack信号迟一点发送 不会影响读写的

你可以仔细看一下 at的 daatsheep看有没有256字节的限制.

普通的24是01-128字节 02=256字节...16=2047字节..

超过部分..器件会自动回到0地址处理,

/////////////////////////////////////////////

看了一下你,后面添加的程序.

如果你这样写.那么read_all那边就不需要用参数了.

因为如果读取,一般都是从0开始读取的..

另外x24c08_read如果是单字节读写函数.而且是正确的话

那么用

for (ii=0ii<4ii++)

{

for (iii=0iii<256iii++)

{

c=x24c08_read(ii,(uchar)iii)

SBUF=c

while (!TI)

这种方式的读取一定是没有问题.

有问题就是你的代码..或者你的eep本身坏了.

如果你感觉时许地上对的话..不妨看一下.

//////////////////////////////////


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存