这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 嵌入式开发» 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 跳转至

回复

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