工具与软件:
hi iam 正在使用 bmp280传感器处理 i2c 接口、同时扫描 i2c 扫描仪 iam 未找到 、请检查下面的代码、了解 sda32、scl33 iam 使用的情况
/*BMP280气压和温度传感器 C 驱动器*/
/* Reza Ebrahimi - https://github.com/ebrezadev */
/*版本1.0*/
#include "bmp280.h"
#include "sci.h"
//#include "DSP28x_Project.h"
/*将任意大小(dataLength)的数组(数据[])写入 I2C 地址(deviceAddress)、
从内部寄存器地址(startRegisterAddress)开始*/
void bmp280_WRITE_ARRAY (uint8_t deviceAddress、uint8_t startRegisterAddress、uint8_t *数据、uint8_t dataLength)
{
uint8_t i;
EALLOW;
//启用 I2C0进行写入
I2caRegs.I2CMDR.bit.IRS = 1;//设置为空闲状态
I2caRegs.I2CSR = deviceAddress;//设置 I2C 器件地址
I2caRegs.I2CCNT = dataLength + 1;//设置要发送的字节数(寄存器+ dataLength)
//写入起始寄存器地址
I2caRegs.I2CDXR = startRegisterAddress;
对于(i = 0;i < I2caRegs.I2CCNT;i++){
I2caRegs.I2CDXR = data[i];//写入数据字节
}
//开始 I2C 通信
I2caRegs.I2CMDR.bit.IRS = 0;//初始化传输
如果(I2caRegs.I2CSTR.bit.BB = 1){
}
如果(I2caRegs.I2CSTR.bit.SCD = 1){
}
EDIS;
}
void bmp280_read_array (uint8_t deviceAddress、uint8_t startRegisterAddress、uint8_t *数据、uint8_t dataLength)
{
uint8_t i;
uint32_t TIMEOUT = 200000;//为读取操作设置更高的超时值
EALLOW;
//步骤1:写入寄存器地址(例如、0xD0表示芯片 ID)
bmp280_WRITE_ARRAY (deviceAddress、startRegisterAddress、NULL、0);//进行写入操作以选择寄存器
//步骤2:执行重复启动(重新启动 I2C 总线以准备读取)
I2caRegs.I2CMDR.bit.STT = 1;//发起一个重新启动条件(重复启动)
//等待 I2C 通信完成
TIMEOUT = 10000;//设置启动条件后的等待超时
while (I2caRegs.I2CSTR.bit.bb = 1 && TIMEOUT > 0){//等待总线空闲(BB =总线忙)
超时--;
}
if (timeout == 0){
scia_msg ("\r\nI2C 总线忙、无法开始读取操作。\0");
EDIS;
返回;
}
//步骤3:设置 I2C 通信以读取数据
I2caRegs.I2CSR = deviceAddress;//设置 I2C 器件地址
I2caRegs.I2CCNT = dataLength;//设置要读取的字节数
I2caRegs.I2CMDR.bit.IRS = 1;//启动 I2C 通信以进行读取操作
//步骤4:等待数据准备就绪并逐字节读取数据
对于(i = 0;i < I2caRegs.I2CCNT;i++){
timeout = 200000;//根据需要调整超时限制
//等待数据准备就绪
while (I2caRegs.I2CSTR.bit.RRDY!= 1 && TIMEOUT > 0){
超时--;
}
if (timeout == 0){
scia_msg ("\r\nREAD OPERATION TIMEOUT.\0");
EDIS;
返回;
}
//从 I2C 数据寄存器读取数据
DATA[i]= I2caRegs.I2CDRR;
}
//步骤5:I2C 读取操作结束
scia_msg("\r\nREAD OPERATION SUCCES.\0");
EDIS;
}
void I2C_Init (void)
{
//初始化 I2C0
I2caRegs.I2CFFTX.bit.TXFFIENA = 0;// Disable the FIFO during setup (在设置期间禁用 FIFO)
I2caRegs.I2CFFRX.bit.RXFFIENA = 0;
// I2caRegs.I2CMDR.bit.IRS = 1;// Reset I2C module (重置 I2C 模块)
I2caRegs.I2CMDR.bit.stp = 1;// Stop I2C communication (停止 I2C 通信)
//配置 I2C 波特率(假设为100kHz)
I2caRegs.I2CCLKL = 100;//设置波特率的低周期
I2caRegs.I2CCLKH = 100;//设置波特率的高周期
//设置主模式并启用 I2C
I2caRegs.I2CMDR.bit.MST = 1;//将 I2C 设置为主模式
I2caRegs.I2CMDR.bit.IRS = 0;//开始 I2C 通信
// I2caRegs.I2CSTR.all = 0x0000;// Clear the interrupt status register (清除中断状态寄存器)
I2caRegs.I2CFFTX.bit.TXFFIENA = 1;//再次启用 FIFO
I2caRegs.I2CFFRX.bit.RXFFIENA = 1;
}
void I2C_Scanner (void)
{
uint8_t deviceAddress;
对于(deviceAddress = 1;deviceAddress < 220;deviceAddress++)
{
//尝试启动给定地址的启动条件
I2caRegs.I2CMDR.all = 0;// Clear Previous settings (清除之前的设置)
I2caRegs.I2CSTR.all = 0;// Clear previous flags (清除先前的标志)
I2caRegs.I2CCNT = 1;//设置要传输的字节数(1个字节)
I2caRegs.I2CDXR = deviceAddress;//写入器件地址
I2caRegs.I2CMDR.bit.STT = 1;//初始化启动条件
//等待事务完成
while (I2caRegs.I2CSTR.bit.bb = 1){}//等待总线空闲
//检查设备是否响应
如果(I2caRegs.I2CSTR.bit.nack = 0)
{
设备地址;
}
设计
{
}
}
}
/*毫秒延迟的延迟函数*/
void delay_function (uint32_t delayMS)
{
uint32_t i;
对于(i = 0;i < delayMS * 1000;i++){
asm (" NOP");//无操作(产生小延迟)
}
}
/*执行幂函数(用于高度计算)*/
float power_function (float x、float y)
{
返回 power_function (x、y);
}
//此函数用于扫描 I2C 设备