打印

用MCU自带的IIC模块程序,不知有错否。SCL波形都没产生。

[复制链接]
1853|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dongshan|  楼主 | 2007-12-10 15:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void IICInit(void) {
 /* ### Init_IIC init code */
 /* IICF: MULT1=0,MULT0=1,ICR5=0,ICR4=0,ICR3=0,ICR2=0,ICR1=0,ICR0=0 */
  IICF = 0x40;                                      
  /* IICA: ADDR7=0,ADDR6=0,ADDR5=0,ADDR4=0,ADDR3=0,ADDR2=0,ADDR1=0 */
  IICA = 0x00;                                      
  /* IICS: TCF=0,IAAS=0,BUSY=0,ARBL=1,SRW=0,IICIF=1,RXAK=0 */
  IICS = 0x12;                         /* Clear the interrupt flags */
  /* IICC: IICEN=1 */
  IICC |= (unsigned char)0x80;                               
  /* IICC: IICEN=1,IICIE=0,MST=0,TX=1,TXAK=0,RSTA=0 */
  IICC = 0x90;   


void IICWriteByte(word adr, byte dt){
    word temp;
    gAdr=adr;
    
    temp = (gAdrH & 0x01) << 1; //get A8 of 24c04 address.
    IICC_TXAK=0;
    IICC|=0x30;            //MST=1 TX=1  and generate START condition
    IICD =IIC_SLAVE_ADR|temp;
    while(!IICS_IICIF);    //wait untill TX completed
    IICS_IICIF=1;          //clear IICIF
    while(IICS_RXAK);      //check for slave ack
      
    IICD = gAdrL;
    while(!IICS_IICIF);    
    IICS_IICIF=1;
    while(IICS_RXAK); 
    
    IICD=dt;
    while(!IICS_IICIF);    
    IICS_IICIF=1;
    while(IICS_RXAK);
    
    IICS_IICIF=1;
    IICC_MST=0;
}

void IICWriteN(word adr,byte *dt,byte n){

    byte i;
    for(i=0;i<n;++i) {
      IICWriteByte(adr+i,dt);
    }
}

byte IICReadByte(word adr){

    word temp;
    byte d;
    
    gAdr=adr;
    temp = (gAdrH&0x01)<<1;     //get A8 of 24c04 address.
    IICC_TXAK=0;
    IICC|=0x30;            //MST=1 TX=1  and generate START condition
    IICD =IIC_SLAVE_ADR|temp;
    while(!IICS_IICIF);    //wait untill TX completed
    IICS_IICIF=1;          //clear IICIF
    while(IICS_RXAK);      //check for slave ack
      
    IICD = gAdrL;
    while(!IICS_IICIF);    
    IICS_IICIF=1;
    while(IICS_RXAK);
    
    IICS_IICIF=1;
    IICC_RSTA=1;
    
    IICD =IIC_SLAVE_ADR|temp;
    while(!IICS_IICIF);    //wait untill TX completed
    IICS_IICIF=1;          //clear IICIF
    while(IICS_RXAK);      //check for slave ack
    
    IICC_TX=0;
    IICC_TXAK=1;
    d=IICD;                //dummy read  
    while(!IICS_IICIF);    
    IICS_IICIF=1;
    IICC_MST=0;
    d=IICD;
    return d;    
}

byte* IICReadN(word adr,byte n){
    word temp;
    byte i,d;
    static byte * dt;
  
    gAdr=adr;
    temp = (gAdrH&0x01)<<1;     //get A8 of 24c04 address.
    IICC_TXAK=0;
    IICC|=0x30;            //MST=1 TX=1  and generate START condition
    IICD =IIC_SLAVE_ADR|temp;
    while(!IICS_IICIF);    //wait untill TX completed
    IICS_IICIF=1;          //clear IICIF
    while(IICS_RXAK);      //check for slave ack
      
    IICD = gAdrL;
    while(!IICS_IICIF);    
    IICS_IICIF=1;
    while(IICS_RXAK);
    
    IICS_IICIF=1;
    IICC_RSTA=1;
    
    IICD =IIC_SLAVE_ADR|temp|1;
    while(!IICS_IICIF);    //wait untill TX completed
    IICS_IICIF=1;          //clear IICIF
    while(IICS_RXAK);      //check for slave ack
    
    IICC_TX=0;
    //IIC_TXAK=1;
    d=IICD;                //dummy read  
    while(!IICS_IICIF);    
    IICS_IICIF=1;
    
    for(i=0;i<(n-1);++i){
    
         dt=IICD;
         while(!IICS_IICIF);    
         IICS_IICIF=1;
    }
    IICC_TXAK=1;
    dt=IICD;
    while(!IICS_IICIF);
    IICC_MST=0;
    return dt;
}

相关帖子

沙发
dongshan|  楼主 | 2007-12-10 15:57 | 只看该作者

芯片是at24c04

使用特权

评论回复
板凳
rodger_br| | 2007-12-10 19:55 | 只看该作者

SCL是主控产生的

不关at24c04什么事

使用特权

评论回复
地板
张明峰| | 2007-12-10 21:43 | 只看该作者

建议看一下应用笔记

AN3291-How to Use IIC Module on M68HC08 HCS08 and HCS12 MCUs.pdf

使用特权

评论回复
5
dongshan|  楼主 | 2007-12-11 09:29 | 只看该作者

3楼的

我当然知道你所说的

我指出是24c04,主要想说是其存储地址是9位的。占用了器件地址的A0位。所以程序用了:
temp = (gAdrH&0x01)<<1;
...
IICD =IIC_SLAVE_ADR|temp;

使用特权

评论回复
6
imwangyi| | 2007-12-13 10:03 | 只看该作者

接上拉了没?

使用特权

评论回复
7
dongshan|  楼主 | 2007-12-13 22:11 | 只看该作者

接了,AT24c04 PI27 应能用于3.3V的吧。

使用特权

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

本版积分规则

79

主题

1142

帖子

7

粉丝