61
818
1514
金牌会员
void iicSendOne(u8 dat) //发送一个字节 { u8 i=8; SCL = 0; SDA = 0; do { if( dat& 0x80 ) SDA = 1; else SDA = 0; Delay2us(); dat<<=1; SCL = 1; Delay2us(); SCL = 0; Delay2us(); } while(--i); }复制代码
使用道具 举报 送花
void iicSendAck(void) //ack { SDA = 0; Delay2us(); SCL = 1; Delay2us(); SCL = 0; Delay2us(); } void iicSendNoAck(void) //noack { SDA = 1; Delay2us(); SCL = 1; Delay2us(); SCL = 0; Delay2us(); } void iicDengAck(void) //等到从机ACK 1是不应答 0是应答 { SDA = 1; Delay2us(); SCL = 1; Delay2us(); ack = SDA; Delay2us(); SCL = 0; Delay2us(); }复制代码
void IIC_Write_NByte(unsigned char *p,unsigned char number ) //iic写入连续的几个字节 { iicStart(); iicSendOne(0xa0); //器件地址 iicDengAck(); if( !ack ) { iicSendOne(0); //写开始字节 iicDengAck(); if( !ack ) { do { iicSendOne(*p); p++; iicDengAck(); if( ack ) //1为不应答 break; } while(--number);// number 为写入连续的几个 注意1页为8个 比如5开始 只能写到7,其他的写入0 1 2 3后推 } } iicStop(); }复制代码
35
2111
2259
荣誉版主
zha*** 发表于 2024-5-21 19:36 老哥问下 6楼的那个图 写周期 啥意思??? 看不懂了
晓*** 发表于 2024-5-21 20:34 就是给缓存区填入数据并停止总线后,EEPROM开始将数据写入存储器,这个时间周期就叫写周期,当前写周期结 ...
void IIC_Read_NByte(unsigned char *p,unsigned char number) //iic读取连续的几个字节 { iicStart(); iicSendOne(0xa0); //从机地址 这里是写 iicDengAck(); if( !ack ) { P60=0; iicSendOne(0); //读取开始的地址 iicDengAck(); if( !ack ) { iicStart(); iicSendOne(0xa1); //fa发送从机地址和读标志位 iicDengAck(); if( !ack ) { do { *p = iicDuOne(); p++; if( number!=1 ) iicSendAck(); } while(--number); iicSendNoAck; } } } iicStop(); } 复制代码
u8 iicDuOne(void) //读取一个字节 { u8 i=8,dat=0; SCL = 0; SDA = 1; do { SCL = 1; Delay2us(); dat<<=1; //因为先传出来的是高位要左移。 if( SDA ) dat |= 1; SCL = 0; Delay2us();复制代码
109
1910
5304
论坛元老
本版积分规则 发表回复 回帖后跳转到最后一页
|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )
GMT+8, 2025-5-8 02:17 , Processed in 0.129416 second(s), 102 queries .
Powered by Discuz! X3.5
© 2001-2025 Discuz! Team.