这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » [M16C64]I2C寄存器设定问题

共4条 1/1 1 跳转至

[M16C64]I2C寄存器设定问题

菜鸟
2008-09-30 11:58:52     打赏

 我想询问一下关于M16C64I2C的问题。

这是我第一次设计I2C程序,有些地方没有理解。结果老是出不来

恳请大家赐教。

 

1

这是初始化部分。

void iic_init(void)

{

              u7mr   = 0x02 ;              //UART7 transmit/receive mode register

              u7brg  = 0x1d ;              //UART7 bit rate generator

              u7c0   = 0xb0 ;              //xu-080917

              u7smr  = 0x01 ;              //UART7 special mode register

              u7smr2 = 0x01 ;              //UART7 special mode register 2

              u7smr3 = 0x00 ;              //UART7 special mode register 3

       pd_sda = 0;                  //sda setting

              pd_scl = 0;                  //scl setting

              u7c1   = 0x05 ;              //xu-080917             

            u7bcnic= 0x00 ;              //UART7 BUS collision detection interrupt

control register

              u7smr4 = 0x30 ;               //UART7 special mode register 4

}

但是我发现在初始化中,寄存器BRG的值并没有正常改变。请问是怎么回事。我这边的设置有什么问题?还有什么附加的部分需要考虑?

 

2

因为未使用中断,那么在发送8bit数据后,是需要检查寄存器u7rb的第八位?

8bit的数据接收后,发送ack是使用u7smr4ackdackc

还有,一般大家是建议使用还是不使用中断?

 

3)这是开始和结束的部分,寄存器的设定是不是也有些问题?

对这个有什么建议?

这是start部分:

void eeprom_start_bit(struct EEPROM_CTL *ctl_p)

{

              while (bbs_u7smr==1);   //wait for control right  

              te_u7c1 = 1;            //--Xu 

              ti_u7c1 = 0;            //--Xu   make the output enable

              stareq_u7smr4 = 1;

              stpreq_u7smr4 = 1;             

              bbs_u7smr = 1;           //占用BBS,但是查看RAM中,这个语句运行后,bbs

并没有改变,不知道什么问题。

              ctl_p->eeprom_1_sts = EEPROM_SLAD;              // slave状态移迁移

}

这样的设置是否正确?

 

发送部分

unsigned char eeprom_put_byt(unsigned char dat)

{

              unsigned char i;

              unsigned char rtncd;

 

              i = 15;

              rtncd = FALSE;

              u7tb = dat;                                                                                                                                       while (i){

                            if (ti_u7c1){                //送信完成                                                           

                                          rtncd = TRUE;                                                                                                                                    // OK

                                          break;

                            }

                            else{

                                          eeprom_wait(10);

                                          i--;

                            }

              }

              return rtncd;     

}

发送完成检查部分

unsigned char eeprom_put_chk()

{

              unsigned char    i, rtncd;

 

              i = 15;

              rtncd = FALSE;                                                                                    

              while (i){

                            /*text empty flag is 1,text is empty*/

                            if (txept_u7c0){    // 发送完成?                                  

                                          if (u7rb_bit8 == I2C_ACKBIT){                                                                                       收到了ack

                                                        rtncd = TRUE;                                                                                                                                                            // OK

                                                        break;

                                          }

                                /*if the text box is not empty,wait*/

                                          else{

                                                        eeprom_wait(WAIT_SEND_10BIT);

                                                        i--;

                                          }

                            }

                            else{

                                          eeprom_wait(WAIT_SEND_10BIT);

                                          i--;

                            }

              }

 

              return              rtncd;

}

接受部分:

  unsigned char eeprom_get_byt(struct EEPROM_CTL *ctl_p)

{

              unsigned char dat;

//              unsigned char dmy;  --by xu

    /* bus競爭的條件不存在,刪除--by xu*/

              while(ri_u7c1 == 0) {}                            // 受信完了

              if(ctl_p->eeprom_2_rem==1)  //if it is the  last byte of the data group

                eeprom_set_stop_sub();                   // 发行停止条件

              else {

                            /*send out the acknowledge*/

                             ackd_u7smr4 = 1;                    

                             ackc_u7smr4 = 1;

              }

              dat = u7rbl; 

 

              return(dat);      

}

 

请大家指教

谢谢。

 

采用的是400kbs传输率,使用UART7。不使用中断。




关键词: M16C64     寄存器     设定     问题    

菜鸟
2008-10-08 11:23:43     打赏
2楼
1) 这些只写(WO)寄存器的值不能被正确读出

2) 建议您使用中断,IIC模式中有三个中断可以使用:检测到开始/停止条件、未检测出应答、检测出应答

菜鸟
2008-10-09 12:41:10     打赏
3楼
未检测出应答、检测出应答意思是?
在master发送data给slave后,接受到slave
传送来的信号?
那在接收data时,用什么中断呢?
直接检测u7ci的ri位?

盼赐教~

菜鸟
2008-10-09 13:39:39     打赏
4楼
检测出应答--ACK、未检测出应答--NACK
也就是说,在master发送data给slave,如果slave返还的是ACK或者NACK信号,这时master会产生中断。
您可以通过IICM2位对中断方式进行选择:NACK或者发送中断、ACK或者接收中断。

共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]