程序:
void Timer0_ISQ(){
TimerIntClear(TIMER0_BASE,TIMER_A);
time_10ms++;
if (time_10ms==1){
I2CMasterSingleTRANSMIT(I2C9_BASE,ALT_Adress,0x48);//第一步发送转换指令(OSR=4096, typ=D1 )下图中发送的是0x40(OSR=256, typ=D1)
//***********约9毫秒(实际)等待转换完成
}
else if (time_10ms==9){
I2CMasterSingleTRANSMIT(I2C9_BASE,ALT_Adress,0x00);//第二步给MS5611发送ADC地址0x00
}
else if (time_10ms==10){
I2CMasterRECEIVEMultDataBytes(I2C9_BASE,ALT_Adress,3,ALT_Arrist);//第三步接收24位数据,详情见下
time_10ms=0;
}
}
//下列程序依据数据手册上的程序框图写成
void I2CMasterRECEIVEMultDataBytes(uint32_t ui32Base,uint8_t ui8SlaveAddr,int Num,uint32_t * Data){
I2CMasterSlaveAddrSet(ui32Base,ui8SlaveAddr,true);//设置7位设备地址,并做Read操作
I2CMasterControl( ui32Base,I2C_MASTER_CMD_BURST_RECEIVE_START);
while(Num){
while(I2CMasterBusy(ui32Base));
*Data=I2CMasterDataGet( ui32Base);//接收MS5611的 24Bit ADC数据
Data++;
Num--;
if(Num)I2CMasterControl( ui32Base,I2C_MASTER_CMD_BURST_RECEIVE_CONT);//做出应答
else I2CMasterControl( ui32Base,I2C_MASTER_CMD_BURST_RECEIVE_FINISH);//不做应答,发出停止位
}
while(I2CMasterBusy(ui32Base));
//*Data=I2CMasterDataGet( ui32Base);//数据手册中有此步骤,但有和没有貌似没区别
}
时序图:
下面两个应该是正常的,参考最后一张图
但是这张图,只采集到了两个数据(共16位),但数据手册上写ADC是24位(参考最后一张图),求教问题出在哪.
此帖出自
小平头技术问答
就把I2C频率改成400KHz就完事了
补:个人发现系统时钟和I2C速率会影响传输,导致出错,具体原因待分析,有大神知道的告诉我也行
一周热门 更多>