打印
[MCU]

24C02的问题

[复制链接]
1433|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ic, iic, TE, AD, ADDR
//==============================================================================
// Example of IIC communication between 9S12XEP100 and EEPROM FM24C256
// BUSCLK = 8MHz
// SCL    = 91kHz
// I2C1 is used for commnication


//==============================================================================
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
//----------------------------

#define MaxLen     128 //
#define  slaveread  0xA1
#define  slavewrite 0xA0
unsigned char RD_data;


//--------------------------
byte WrData[8];
byte RdData[8];
byte RdBuf;
word length;
unsigned char x;
//---
typedef union
{
  word EE_Address;
  struct
  {
    byte Address_H;
    byte Address_L;
  }Bytes;
}tAddr;
tAddr ADDR;

#define Address ADDR.EE_Address
#define Addr_L ADDR.Bytes.Address_L
#define Addr_H ADDR.Bytes.Address_H

//******  Init routines  *******************
//--
void IIC0_init(void)
{
        IIC0_IBFD = 0x4C;                               
        IIC0_IBAD = 0x00;                        
        IIC0_IBCR = 0x80;                               
        //IIC0_IBSR_IBAL = 1;                     
}
//--

//---------------------------------------------------------
void IIC_write_nbytes(word addr, byte len)
{
  byte i;
Address = addr; // load address;
IIC0_IBCR_TXAK = 0; ;
IIC0_IBCR |= 0x30; // RX/TX = 1; MS/SL = 1; TXAK = 0;
// And generate START condition;
//-------start of transmit first byte to IIC bus-----
IIC0_IBDR = slavewrite; // Address the slave and set up for master transmit;

while (!IIC0_IBSR_IBIF); // wait until IBIF;
IIC0_IBSR_IBIF=1; // clear the interrupt event flag;
while(IIC0_IBSR_RXAK); // check for RXAK;
//-----Slave ACK occurred------------
IIC0_IBDR = Addr_H; // Send high byte of the word address;
while (!IIC0_IBSR_IBIF); // wait until IBIF;
IIC0_IBSR_IBIF=1; // clear the interrupt event flag;
while(IIC0_IBSR_RXAK); // check for RXAK;
//-----Slave ACK occurred------------
IIC0_IBDR = Addr_L; // Send low byte of the word address;
while (!IIC0_IBSR_IBIF); // wait until IBIF;
IIC0_IBSR_IBIF=1; // clear the interrupt event flag;
while(IIC0_IBSR_RXAK); // check for RXAK;
//-----Slave ACK occurred------------
for(i=0;i<len;i++)
{  
  IIC0_IBDR = WrData[i];//data;
  while (!IIC0_IBSR_IBIF); // wait until IBIF;
  IIC0_IBSR_IBIF=1; // clear the interrupt event flag;
  while(IIC0_IBSR_RXAK); // check for RXAK;
}
//-----Slave ACK occurred------------
IIC0_IBCR_MS_SL = 0; // generate STOP condition;
}

//-------------------------------------------------------------------------
void IIC_read_nbytes(word addr,byte len)
{
byte dummy;
byte i;
Address = addr;
length=len;
if(length>=MaxLen)
{
  length=MaxLen;
}
IIC0_IBCR_TXAK = 0; // TXAK = 0;
IIC0_IBCR |= 0x30; // RX/TX = 1; MS/SL = 1; TXAK = 0;
// And generate START condition;
IIC0_IBDR = slavewrite; // Address the slave and set up for master transmit;
while (!IIC0_IBSR_IBIF); // wait until IBIF;
IIC0_IBSR_IBIF=1; // clear the interrupt event flag;
while(IIC0_IBSR_RXAK); // check for RXAK;
//-----Slave ACK occurred------------
IIC0_IBDR = Addr_H; // Send high byte of word address;
while (!IIC0_IBSR_IBIF); // wait until IBIF;
IIC0_IBSR_IBIF=1; // clear the interrupt event flag;
while(IIC0_IBSR_RXAK); // check for RXAK;
//-----Slave ACK occurred------------
IIC0_IBDR = Addr_L; // Send low byte of word address;
while (!IIC0_IBSR_IBIF); // wait until IBIF;
IIC0_IBSR_IBIF=1; // clear the interrupt event flag;
while(IIC0_IBSR_RXAK); // check for RXAK;
//-----Slave ACK occurred------------
IIC0_IBCR_RSTA = 1; // set up repeated start;
IIC0_IBDR = slaveread; // (slave_address) | (RW = 1);
while (!IIC0_IBSR_IBIF); // wait until IBIF;
IIC0_IBSR_IBIF=1; // clear the interrupt event flag;
while (IIC0_IBSR_RXAK); // check for RXAK;
//-----Slave ACK occurred------------
IIC0_IBCR_TX_RX = 0; // set up to receive;
dummy=IIC0_IBDR;//RD_data = IIC0_IBDR; // dummy read;
for(i=0;i<length;i++)
{
  if(i==7){
    while(!IIC0_IBSR_IBIF);
    IIC0_IBSR_IBIF = 1;
    RdData[7]=IIC0_IBDR;
  }
  else{   
  while(!IIC0_IBSR_IBIF);
  IIC0_IBSR_IBIF=1;
  while (IIC0_IBSR_RXAK);
  RdData[i]=IIC0_IBDR;
  }
}
IIC0_IBCR_TXAK = 1; // acknowledge disable;  
while (!IIC0_IBSR_IBIF); // wait until IBIF;
IIC0_IBSR_IBIF=1; // clear the interrupt event flag;
IIC0_IBCR_MS_SL = 0; // generate stop signal;
RD_data = IIC0_IBDR; // read right data;
}

//******  main routines  *******************
void main(void)
{
  unsigned int i;
  unsigned int j,k;
  //---- IIC -----
  IIC0_init();
  WrData[0]=1;
  WrData[1]=0;
  WrData[2]=0;
  WrData[3]=8;
  WrData[4]=6;
  WrData[5]=1;
  WrData[6]=1;
  WrData[7]=255;
  //---- main cycle ---
  //LedPad22Dir=1;
  //LedCpu=1;

   do{
   
   IIC_write_nbytes(0x0064,8);
   for(j=0;j<0x1000;j++);
     IIC_read_nbytes(0x0064,8);
  //--
  
  for(j=0;j<50000;j++);
  //LedCpu=~LedCpu;

   }
while(1);

  i+=8;  

  
    /**/
}
//==============================================================================
这是我用的程序,二楼写问题

相关帖子

沙发
谢谢谢林达|  楼主 | 2017-11-12 11:06 | 只看该作者
问题就是,程序跑得不是很理想,程序就走到这就走不动了。一直等待一个ACK信号。这是怎么回事呢。但是有时候能跑通!

QQ图片20171112110610.png (53.22 KB )

QQ图片20171112110610.png

使用特权

评论回复
板凳
gxs64| | 2017-11-12 12:34 | 只看该作者
注意io口方向

使用特权

评论回复
地板
谢谢谢林达|  楼主 | 2017-11-12 14:41 | 只看该作者

我用的芯片有IIC通信寄存器。飞思卡尔s12系列的

使用特权

评论回复
5
gxs64| | 2017-11-12 16:52 | 只看该作者
谢谢谢林达 发表于 2017-11-12 14:41
我用的芯片有IIC通信寄存器。飞思卡尔s12系列的

如果是软件IIC,一定有方向问题。

使用特权

评论回复
6
谢谢谢林达|  楼主 | 2017-11-12 18:02 | 只看该作者
gxs64 发表于 2017-11-12 16:52
如果是软件IIC,一定有方向问题。

寄存器中有一位是设置主从的,出现这种情况的话,主从这一位不能有效置位,也就是说他是从,不能设置为主。不知道咋回事,。。。

使用特权

评论回复
7
linqing171| | 2017-11-12 20:21 | 只看该作者
莫非仲裁失败? 上拉电阻太大了?

使用特权

评论回复
8
谢谢谢林达|  楼主 | 2017-11-13 09:31 | 只看该作者
linqing171 发表于 2017-11-12 20:21
莫非仲裁失败? 上拉电阻太大了?

不知道啊老哥,IIC通信是不是需要先读后写还是先写后读呢?如果我随机读取数据,会出现数据丢失的问题。这有事怎么回事呢?程序我看了三四遍,,感觉没啥大毛病啊

使用特权

评论回复
9
谢谢谢林达|  楼主 | 2017-11-13 09:35 | 只看该作者
linqing171 发表于 2017-11-12 20:21
莫非仲裁失败? 上拉电阻太大了?

就比如我在0x0102地址写了个1,0,0,8,6,11,255八个字节,但是我读出来是这样的,是怎么回事呢?

1510536939(1).png (21.34 KB )

1510536939(1).png

使用特权

评论回复
10
linqing171| | 2017-11-13 14:14 | 只看该作者
24C02没有那么多地址。
如果从0地址一次只能写4个字节,那么从0x02地址开始一次就只能写4-2=2个;从3地址开始只能写4-3=1个;从4地址开始又能一次写4个了。

使用特权

评论回复
11
谢谢谢林达|  楼主 | 2017-11-14 16:51 | 只看该作者
linqing171 发表于 2017-11-13 14:14
24C02没有那么多地址。
如果从0地址一次只能写4个字节,那么从0x02地址开始一次就只能写4-2=2个;从3地址开 ...

我试的可以写八个啊,老哥。

使用特权

评论回复
12
ningling_21| | 2017-11-15 14:23 | 只看该作者
谢谢谢林达 发表于 2017-11-14 16:51
我试的可以写八个啊,老哥。

24C02有多少字节的存储空间?

使用特权

评论回复
13
谢谢谢林达|  楼主 | 2017-11-15 16:06 | 只看该作者
ningling_21 发表于 2017-11-15 14:23
24C02有多少字节的存储空间?

2K,2048bit,也就是256个字节,地址从0x00-0xff

使用特权

评论回复
14
ningling_21| | 2017-11-15 16:08 | 只看该作者
谢谢谢林达 发表于 2017-11-15 16:06
2K,2048bit,也就是256个字节,地址从0x00-0xff

空间只有256字节,怎么会有0x0102这个地址呢?

使用特权

评论回复
15
谢谢谢林达|  楼主 | 2017-11-19 08:33 | 只看该作者
ningling_21 发表于 2017-11-15 16:08
空间只有256字节,怎么会有0x0102这个地址呢?

,我也找到这个问题了,!嘿嘿

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

79

帖子

0

粉丝