首页 > 其他分享 >51模拟IIC-页读写操作

51模拟IIC-页读写操作

时间:2024-05-16 22:30:55浏览次数:27  
标签:SCL 读写操作 void 51 unsigned delay SDA IIC nop

51代码页读写IIC--模拟IIC

#include <reg52.h>
#include <intrins.h>

sbit SDA = P0^0;
sbit SCL = P0^1;
sbit LED = P2^0;

unsigned char code table[] = {0x1c,0X3B,0X2C,0X2D,0X5A,0X5C,0XC5,0X5b};
void delayms(unsigned int t)
{
    unsigned int i,j;
    for(i = t; i > 0; i --)
    for(j = 110; j > 0; j --);
}
void delay()
{
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        
}
void start()
{
        SCL = 1;
        SDA = 1;
        delay();
        SDA = 0;
        delay();
        SCL = 0;
                
}

void stop()
{
        
        SDA = 0;
        delay();
        SCL = 1;
        delay();
        SDA = 1;
        delay();

}

void ack()
{
        
        SCL = 0;

        delay();
        while(SDA);
        SCL = 1;
        delay();
        
        SCL = 0;
}

void noack()
{
        SCL = 0;
        
        SDA = 1;
        SCL = 1;
        delay();
        SCL = 0;

}

void writebyte(unsigned char byte)
{
        //MSB first
        unsigned char i = 0;
        SCL = 0;
        for(i = 0; i < 8; i ++)
        {
                byte <<= 1;
                SDA = CY;
                delay();
                SCL = 1;
                delay();
                SCL = 0;
        }
        
//        SDA = 1;//waiting for ack
//        delay();
        
        

        

}

unsigned char readbyte()
{
        unsigned char i = 0,val = 0;
        SCL = 0;
        for(i = 0; i < 8 ; i ++)
        {
                val <<= 1;
                delay();
                SCL = 1;
                delay();
                if(SDA)
                {
                        val |= 0x01;
                }        
                else
                {
                        val |= 0x00;
                }
                SCL = 0;
                
        }

        SCL = 0;//release IIC bus

        return val;

            
    

}


void write_data(unsigned char add, unsigned char byte)
{
         start();
         writebyte(0xae);
         ack();
         writebyte(add);
         ack();
         writebyte(byte);
         ack();

         stop();
}

unsigned char read_data(unsigned char add)
{
        unsigned char val = 0;
        start();
        writebyte(0xae);
        ack();
        writebyte(add);
        ack();
        start();
        writebyte(0xaf);
        ack();
        val = readbyte();
        noack();
        stop();

        return val;
}

void pagewrite(unsigned char add)
{
    unsigned char i;
    start();
    writebyte(0xae);
    ack();
    writebyte(add);
    ack();
    for(i = 0; i < 8; i ++)
    {
        writebyte(table[i]);
        ack();
    }
    stop();
}

unsigned char *pageread(unsigned char add)
{
    unsigned char value[8],i;
    start();
    writebyte(0xae);
    ack();
    writebyte(add);
    ack();

    start();
    writebyte(0xaf);
    ack();
    for(i = 0; i < 8; i ++)
    {
        value[i] = readbyte();
        if(i == 7)
        {
            noack();
        }
        else
        {
            SCL = 0;  //主机来应答
    
            delay();
            SDA = 0;
            delay();
            SCL = 1;
            delay();
            
            SCL = 0;
            delay();
            SDA = 1;
            delay();
            
        }
        delay();
    }
    stop();

    return value;
    

}
void main()
{
        unsigned char *TMP_VAL, Tmp = 0;
/**     write_data(0x01,0xAC); //TEST 1    
        delayms(500);     

        Tmp = read_data(0x01);
        delayms(5);
        if(Tmp == 0xac)
        {
            P2 = Tmp;
        } 
 **/
/**        pagewrite(0X00);  //TEST2

        delayms(500);     

        Tmp = read_data(0x07);
        delayms(5);
        if(Tmp == table[7])
        {
            P2 = Tmp;
        }         **/
        pagewrite(0X00);
        delayms(600);
        TMP_VAL = pageread(0x00);
        delayms(500);
        if(*(TMP_VAL+1) == table[1])
        {
            P2 = *(TMP_VAL+1);
        }
        while(1);
}

注意以下要点

过程中出现只能写入偶数情况,是Stop()函数的问题,在SCL上升沿时发生了SDA改变导致的,调整一下先后顺序即可;

页读操作注意ack是主机拉低SDA发出的应答,和单字节读写不同;

如何接收函数返回的数组,以及如何写这个返回数组的函数。

调试过程中有EE不拉低SDA应答的情况,后来排查是EE芯片坏了。

写完数据不能立刻读,要有稍长的延时才行。

标签:SCL,读写操作,void,51,unsigned,delay,SDA,IIC,nop
From: https://www.cnblogs.com/chillytao-suiyuan/p/18196878

相关文章

  • 群晖ds1517+解决第三方Marvell AQC107 10Gbe网卡驱动问题
    群晖ds1517+解决第三方MarvellAQC10710Gbe网卡驱动问题转载注明来源:本文链接来自osnosn的博客,写于2024-05-15.说明这是网友mohawk解决问题的经过,征得同意后,贴在这里。给大家参考。背景好友打算升级到全屋有线万兆2.5g网络,陆续装备了路由器、交换机等,但家里的群晖ds......
  • 代码随想录算法训练营第第八天 | 344.反转字符串 、541. 反转字符串II、卡码网:54.替
    344.反转字符串建议:本题是字符串基础题目,就是考察reverse函数的实现,同时也明确一下平时刷题什么时候用库函数,什么时候不用库函数题目链接/文章讲解/视频讲解:https://programmercarl.com/0344.反转字符串.html/***@param{character[]}s*@return{void}Donotret......
  • 3SRB2516-ASEMI适配大功率充电桩3SRB2516
    编辑:ll3SRB2516-ASEMI适配大功率充电桩3SRB2516型号:3SRB2516品牌:ASEMI封装:SGBJ-5正向电流(Id):25A反向耐压(VRRM):1600V正向浪涌电流:400A正向电压(VF):1.05V引脚数量:5芯片个数:5芯片尺寸:88MIL功率(Pd):大功率设备工作温度:-55°C~150°C类型:整流桥、插件整流桥3SRB2516整流桥描......
  • 基于UltraScale架构的XCVU3P-3FFVC1517E XCVU3P-2FFVC1517I XCVU3P-1FFVC1517E高性能
    概述VirtexUltraScale+器件是基于14nm/16nmFinFET节点的高性能FPGA,支持3DIC技术和多种计算密集型应用。AMD第三代3DIC使用堆叠硅片互联(SSI)技术打破了摩尔定律的限制,并且实现了最高信号处理和串行I/O带宽,以满足最严格的设计要求。它还提供了一个虚拟的单片设......
  • 一键自动化博客发布工具,用过的人都说好(51cto篇)
    51cto是一个优秀的博客平台,今天给大家讲解一下blog-auto-publishing-tools如何自动发布博客到51cto上。当然在实现过程中有可能会遇到各种困难,不过不用担心,我们一个个来解决。前提条件前提条件当然是先下载blog-auto-publishing-tools这个博客自动发布工具,地址如下:https://gi......
  • openGauss 写入和读写操作
    写入和读写操作关于写入和读写操作的命令:INSERT,可向表中插入一行或多行数据。UPDATE,可修改表中现有数据。DELETE,可删除表中现有数据。COPY,导入数据。INSERT和COPY是纯写入的操作。并发写入操作,需要等待,对同一个表的操作,当事务T1的INSERT或COPY未解除锁定时,事务T2的INSERT......
  • AtCoder Beginner Contest 351 E - Jump Distance Sum
    题目链接Hint1:只能斜着走,容易想到黑白棋盘,\((x+y)\%2==0\)位于一个团,\((x+y)\%2==1\)位于另一个团,分别求和。Hint2:\(dist=max(|x1-x2|,|y1-y2|)\),这是切比雪夫距离,将坐标系倾斜\(45^{\circ}\),改为曼哈顿距离\(dist=|x1-x2|+|y1-y2|\),即\(X=x+y,Y=x-y\),这样就可以将横纵坐标......
  • 20240514打卡
    第十二周第一天第二天第三天第四天第五天第六天第七天所花时间1h0h代码量(行)1440博客量(篇)11知识点了解界面美化CSS,mdn官网学习团队趣味活动合作......
  • Cubemx IIC驱动oled 显示汉字、字母
    OLED实物图: 创建工程1.配置外部晶振 2.配置时钟 3.使能IIC 4.生成代码移植驱动代码移植oled.h#ifndef__OLED_H#define__OLED_H#include"i2c.h"/*OLED控制用函数*/voidOLED_Set_Pos(uint8_tx,uint8_ty);voidOLED_Display_On(void);voidO......
  • 干电池升压芯片PW5100:高效转换,赋能小型设备
    内容简述目录:1,干电池的工作电压范围2,平芯微根据干电池规格书整理的干电池输出电流性能表3,干电池负载能力的理解和解释4,专用干电池升压芯片PW51005,干电池升压芯片采用0603,0805,1206电感和输出电流测试6,干电池升压芯片真关断控制版本PW51037,电荷泵升压IC和专用干电池升压芯片......