找回密码
 立即注册
查看: 661|回复: 6

关于IIC数据连续读取的问题

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:163
  • 最近打卡:2025-06-17 19:16:32
已绑定手机

54

主题

39

回帖

566

积分

高级会员

积分
566
发表于 2024-3-12 11:48:09 | 显示全部楼层 |阅读模式
//-------------------------------------------------------------------------------------------------
void        ee_start( void)
{
        ee_scl = 1 ;
        ee_sda = 1 ;
        delay(10) ;
        ee_sda = 0 ;
        delay(10) ;
        ee_scl = 0 ;
        delay(10) ;
                }
//-------------------------------------------------------------------------------------------------
void        ee_stop( void)
{
        ee_scl = 0 ;
        ee_sda = 0 ;
        delay(10) ;
        ee_scl = 1 ;
        delay(10) ;
        ee_sda = 1 ;
        delay(10) ;
                }
//-------------------------------------------------------------------------------------------------
unsigned        char        r_ack(void)
{
unsigned        char        ack = 0x55 ;
        delay(5)         ;
        ee_scl = 1         ;
        delay(5)         ;
        if(ee_sda == 0 )        ack = 0xaa ;
        ee_scl = 0         ;
        return        ack ;
                                        }       
//-------------------------------------------------------------------------------------------------
//55输出0  aa输出1
void        w_ack(unsigned        char ack)
{
        if ( ack == 0x55 )                ee_sda = 0 ;
        else if ( ack == 0xaa )                ee_sda = 1 ;
        delay(5)         ;
        ee_scl = 1         ;
        delay(5)         ;
        ee_scl = 0         ;
                                        }       
//---------------------------------------------------------------------------------------------
//        ee.ack == 0xaa  表示正确
void        ee_send_byte(unsigned        char        i)
{
unsigned        char                n  =  0 ;       
        while ( n  <  8 )
        {
                if (( i & 0x80 ) == 0x00 )
                {        ee_sda = 0 ;        }
                else               
                {        ee_sda = 1 ;        }
                delay(5)         ;
                ee_scl = 1         ;
                delay(5)         ;
                ee_scl = 0         ;
                i = i << 1         ;                       
                n = n + 1         ;
                                }
//-------------------------------------
//                读取 ACK 位
//                ack[0] = r_ack( ) ;
                        }
//---------------------------------------------------------------------------------------------
//        ee.ack == 0xaa  表示正确
unsigned        char        ee_read_byte( )
{
unsigned        char                i   ;       
unsigned        char                n  =  0 ;       
        while ( n  <  8 )
        {        ee_scl = 1 ;
                delay(5) ;
                i = ( i << 1 ) & 0xfe ;
                if ( ee_sda == 1 )                {        i = i + 1 ;        }
                ee_scl = 0         ;
                delay(5) ;
                n = n + 1 ;                }
//---------------------------------------------------
        return                i        ;
                        }
//----------------------------------------------------------------------------------------------
//                2408         address = 0 -- 3ff
void        ee_write( unsigned char address,unsigned char dat)
{       
        ee_start(  ) ;
        ee_send_byte( 0xa0 ) ;       
        ack[0] = r_ack( ) ;
        ee_send_byte( address ) ;       
        ack[1] = r_ack( ) ;
        ee_send_byte( dat ) ;       
        ack[2] = r_ack( ) ;
        ee_stop(  ) ;
//------------------------------------------
                delay_ms(5) ;
//读 ACK 约使用 4ms
//        delay_ms(10);
        do
        {        ee_start(  ) ;
                ee_send_byte( 0xa0 ) ;       
                ack[3] = r_ack( ) ;
                        }        while ( ack[3] == 0x55 ) ;       
        ee_stop(  ) ;
                }               
//----------------------------------------------------------------------------------------------
//        读 1 BYTE  约需要 1 ms
//                2408         address = 0 -- 3ff
unsigned        char        ee_read( unsigned char address )
{
unsigned        char                i  ;
        ee_start(  ) ;
        ee_send_byte( 0xa0 ) ;       
        ack[0] = r_ack( ) ;
        ee_send_byte( address ) ;       
        ack[1] = r_ack( ) ;
        ee_start(  ) ;
        ee_send_byte( 0xa1  ) ;       
        ack[2] = r_ack( ) ;
        i =        ee_read_byte( ) ;
        w_ack(0xaa) ;
        ee_stop(  ) ;
        return        i ;
                }               
//----------------------------------------------------------------------------------------------
void        ee_read_p( unsigned char address )
{
        ee_start(  ) ;
        ee_send_byte( 0xa0 ) ;       
        ack[0] = r_ack( ) ;
        ee_send_byte( address ) ;       
        ack[1] = r_ack( ) ;
        ee_start(  ) ;
        ee_send_byte( 0xa1  ) ;       
        ack[2] = r_ack( ) ;
//--------------------------------
        a[0] =        ee_read_byte( ) ;
        w_ack(0x55) ;
        //--------------------------------
        a[1] =        ee_read_byte( ) ;
        w_ack(0x55) ;
        //--------------------------------
        a[2] =        ee_read_byte( ) ;
        w_ack(0x55) ;
//--------------------------------
        a[3] =        ee_read_byte( ) ;
        w_ack(0x55) ;
//--------------------------------
        a[4] =        ee_read_byte( ) ;
        w_ack(0x55) ;
//--------------------------------
        a[5] =        ee_read_byte( ) ;
        w_ack(0x55) ;
//--------------------------------
        a[6] =        ee_read_byte( ) ;
        w_ack(0x55) ;
//--------------------------------
        a[7] =        ee_read_byte( ) ;
        w_ack(0xaa) ;
        ee_stop(  ) ;
                }               


#include <STC32G.H>
#include "stdio.h"
#include "intrins.h"
#include         "config.h"
#include "base.c"
#include "2402.c"
//==============================================================================================================
void main()
{
    WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1; //扩展寄存器(XFR)访问使能
    CKCON = 0; //提高访问XRAM速度

    P0M1 = 0;   P0M0 = 0;   //设置P0.4、P0.5为漏极开路(实验箱加了上拉电阻到3.3V)
    P1M1 = 0;   P1M0 = 0;   //设置P1.4、P1.5为漏极开路(实验箱加了上拉电阻到3.3V)
    P2M1 = 0;   P2M0 = 0;   //设置P2.2~P2.5为漏极开路(实验箱加了上拉电阻到3.3V)
    P3M1 = 0;   P3M0 = 0;   //设置P3.4、P3.6为漏极开路(实验箱加了上拉电阻到3.3V)
    P4M1 = 0;   P4M0 = 0;   //设置P4.2~P4.5为漏极开路(实验箱加了上拉电阻到3.3V)
          P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
//-----------------------------------------------------------
                P1M0 = 0x02; P1M1 = 0x00;
//                P2M0 = 0xc0; P2M1 = 0xc0;
    P0M0 = 0x0c; P0M1 = 0x0c;

//-----------------------------------------------------------
                rs232_ini( )  ;
                EA = 1;     //打开总中断
//--------------------------------------------------------       
//问题:单独一个BYTE读写都是对的,连续读就不正确,此时只有第一个BYTE正确
        while(1)
        {
                                delay_ms(1000);
                                led  =  ~led ;
                                ee_read_p(0) ;                               
                                rs2_tx( 0xaa );                               
                                rs2_tx( 0xaa );                               
                                rs2_tx( 0xaa );                               
                                rs2_tx( 0xaa );
                                rs2_tx( ack[0] );
                                rs2_tx( ack[1] );
                                rs2_tx( ack[2] );
                                rs2_tx(a[0]);                               
                                rs2_tx(a[1]);                               
                                rs2_tx(a[2]);                               
                                rs2_tx(a[3]);                               
                                rs2_tx(a[4]);                               
                                rs2_tx(a[5]);                               
                                rs2_tx(a[6]);                               
                                rs2_tx(a[7]);                               

                                delay_ms(1000);
                                led  =  ~led ;
                                rs2_tx( 0xaa );                               
                                rs2_tx( 0xaa );                               
                                rs2_tx( 0xaa );                               
                                rs2_tx( 0xaa );
                                ee_read_p(0x10) ;                               
                                rs2_tx( ack[0] );
                                rs2_tx( ack[1] );
                                rs2_tx( ack[2] );
                                rs2_tx(a[0]);                               
                                rs2_tx(a[1]);                               
                                rs2_tx(a[2]);                               
                                rs2_tx(a[3]);                               
                                rs2_tx(a[4]);                               
                                rs2_tx(a[5]);                               
                                rs2_tx(a[6]);                               
                                rs2_tx(a[7]);                               

                                delay_ms(1000);
                                led  =  ~led ;
                                rs2_tx( 0xaa );                               
                                rs2_tx( 0xaa );                               
                                rs2_tx( 0xaa );                               
                                rs2_tx( 0xaa );
                                ee_read_p(0x20) ;                               
                                rs2_tx( ack[0] );
                                rs2_tx( ack[1] );
                                rs2_tx( ack[2] );
                                rs2_tx(a[0]);                               
                                rs2_tx(a[1]);                               
                                rs2_tx(a[2]);                               
                                rs2_tx(a[3]);                               
                                rs2_tx(a[4]);                               
                                rs2_tx(a[5]);                               
                                rs2_tx(a[6]);                               
                                rs2_tx(a[7]);                               
                                        }
                        }




                       
                       
                       
                       
                       
                       

eeprom_read.zip

4.5 KB, 下载次数: 55

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:461
  • 最近打卡:2025-06-18 01:15:53
已绑定手机

38

主题

2222

回帖

2671

积分

荣誉版主

积分
2671
发表于 2024-3-12 20:09:56 | 显示全部楼层
那么,问题是啥,“不说了,问题都在代码里”?
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:163
  • 最近打卡:2025-06-17 19:16:32
已绑定手机

54

主题

39

回帖

566

积分

高级会员

积分
566
发表于 2024-3-12 22:24:32 | 显示全部楼层
晓*** 发表于 2024-3-12 20:09
那么,问题是啥,“不说了,问题都在代码里”?

是这样的,我的程序在MICROCHIP芯片中运行是成功的,
拿到STC32上发现I2C连续 读 只能读第一个BYTE成功,
第二个就不对了。尤其是我需要 LM75A 和 HDC1080 的读取全错了

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:100
  • 最近打卡:2025-06-17 08:13:13

734

主题

1万

回帖

1万

积分

管理员

积分
16690
发表于 2024-3-12 22:34:22 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:499
  • 最近打卡:2025-06-17 08:23:30
已绑定手机

14

主题

1312

回帖

3302

积分

论坛元老

积分
3302
发表于 2024-3-12 23:39:50 | 显示全部楼层
sh*** 发表于 2024-3-12 22:24
是这样的,我的程序在MICROCHIP芯片中运行是成功的,
拿到STC32上发现I2C连续 读 只能读第一个BYTE成功,
...

既然有对比,直接逻辑分析仪对比分析下应该比较容易发现问题。大概率还是时序方面问题
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:461
  • 最近打卡:2025-06-18 01:15:53
已绑定手机

38

主题

2222

回帖

2671

积分

荣誉版主

积分
2671
发表于 2024-3-19 21:03:32 | 显示全部楼层
sh*** 发表于 2024-3-12 22:24
是这样的,我的程序在MICROCHIP芯片中运行是成功的,
拿到STC32上发现I2C连续 读 只能读第一个BYTE成功,
...

读完一个字节要给器件发ACK的,直到不想继续读了,发个NACK,这是协议要求的,必须严格遵循。
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:163
  • 最近打卡:2025-06-17 19:16:32
已绑定手机

54

主题

39

回帖

566

积分

高级会员

积分
566
发表于 2024-3-26 11:06:14 | 显示全部楼层
晓*** 发表于 2024-3-19 21:03
读完一个字节要给器件发ACK的,直到不想继续读了,发个NACK,这是协议要求的,必须严格遵循。 ...

肯定遵守协议了,不然在MICROCHIP单片机上就不会成功
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-18 01:26 , Processed in 0.120958 second(s), 89 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表