我想询问一下关于M16C64的I2C的问题。
这是我第一次设计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是使用u7smr4的ackd和ackc?
还有,一般大家是建议使用还是不使用中断?
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。不使用中断。