这个硬件i2c看来我的确调不来了...两个板子一个主一个从,不修改任何配置,从的在主循环里收然后等,主的在主循环里发然后等。上拉电阻也接了,还是不行。 我想采用从模拟,现在模拟程序基本写好,用DM2410做主循环发,STM32收。从模拟函数在主循环里一直收,2410要发3、4次,ST才能收到。不知道什么原因? i2c_deal() { PreState = READ_SDA() ; //读取SDA while( READ_CLK()&&NN--) //若SCL=1 再次对SDA { NowState = READ_SDA() ; if( PreState && !NowState ) //由高到低 start signal START_flag = 1; else if( !PreState && NowState )//由低到高 stop signal { STOP_flag = 1 ; break ; //收到停止信号退出 } PreState = NowState ; /********************Start*************************/ if( START_flag ) //刚产生起始条件 { START_flag = 0 ;
while( READ_CLK() ); //等待START时的SCL高电平状态结束 for(num=8;num>0;num--) //接收器件地址 { while( !READ_CLK() ); //SCL低电平状态就等待其变高时数据才有效 DEVICE_ADR<<=1; if( READ_SDA() ) //数据的第一个CLK高电平来临 DEVICE_ADR |= 0x01; while( READ_CLK() ); //SCL高电平状态就等待其变低 } /*************************ACK********************/ //判断是自己的地址给予应答 if( (DEVICE_ADR) == I2C1_SLAVE_ADDRESS7 ) { ACK(); } else //不是自己的地址,直接退出 { break; } /************************************************/ //////////// 接收单元地址 暂时不用 /////////// ///////////////////// 开始data_to_rec = 7字节接收数据 ///////////////// if( !(DEVICE_ADR & 0x01) )//主发从收,即IIC从设备进行命令的接收 { do{ for(num=8;num>0;num--) //接收数据位 { while( !READ_CLK() ); //SCL低电平状态就等待其变高时数据才有效 REC_DATA<<=1; if( READ_SDA() ) //数据的第一个CLK高电平来临 REC_DATA |= 0x01; while( READ_CLK() ); //SCL高电平状态就等待其变低 } /*************************ACK********************/ ACK(); iic_data[data_num++] = REC_DATA ; //将收到的这个字节的内容先存起来 /************************************************/ }while( data_to_rec-- > 0 ); } }//if } //while }
|