主题中讨论的其他器件:CC2650、 CC2650MODA、 CC2640
工具/软件:Code Composer Studio
大家好、
我正在尝试为 mpu6050写入 I2C 接口。
对于 IC、将会有单字节和多字节接收、我正在尝试编写通用代码。
我的代码可以很好地进行多字节传输、但单字节传输不起作用。 此外、该代码执行 i2c 传输、单字节传输也不起作用。
如果您能为我提供帮助、我将不胜感激。
当我用德州仪器编写 I2C 驱动程序时、我总是感到沮丧。 我非常了解 I2C 协议、但在为微控制器编写代码时、我需要花费数小时。
我是否有办法了解如何为 I2C 驱动程序编写代码?
此致
#include
#include "MPU6050.h"
const uint8_t PORT_MAPPING 3_3[]=
{
//Portmapping EUSCI_B0_SPI_I2C.SCL 至 P3.5、EUSCI_B0_SPI_I2C.SDA 至 P3.7
PM_NONE、PM_NONE、PM_NONE、PM_NONE、PM_NONE、 PM_UCB.S、PM_NONE、PM_UCB0SDA、
};
#define SLAVE_ADDRESS 0x68
uint8_t NUM_OF_REC_Bytes_B0 = 2;
//const uint8_t TXData[]={0x07};
//const uint8_t TXData[]={0x00};
//static uint8_t RXData[NUM_OF_REC_Bytes];
uint8_t TXData_B0[256]={0x07};
uint8_t* TXDataPtr_B0;
uint8_t RXData_B0[256];
静态易失性 uint32_t xferIndex_B0;
volatile char stopSent_B0;
uint8_t 发送_B0 = 0;
uint8_t TXByteCtr = 0;
uint8_t single = 0;
const eUSCI_I2C_MasterConfig i2cConfig_B0 =
{
EUSCI_B_I2C_CLOCKSOURCE_SMCLK、 // SMCLK 时钟源
12000000、 // SMCLK = 3MHz
EUSCI_B_I2C_SET_DATA_RATE 100KBPS、 //所需的100kHz I2C 时钟
0、 //无字节计数器阈值
EUSCI_B_I2C_NO_AUTO_STOP //无自动停止
};
void Setup_MPU6050 ()
{
//端口映射相应的引脚。 有关详细信息、请参阅上述数组
MAP_PMAP_configurePorts ((const uint8_t *) port_mapping _3_3、P3MAP、1、PMAP_disable_reconfiguration);
//为 EUSCI_B0_SPI_I2C EUSCI_B0_SPI_I2C.SCL 配置 P3.5
MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P3、GPIO_PIN5、GPIO_PRIMARY_MODULE_Function);
//为 EUSCI_B0_SPI_I2C EUSCI_B0_SPI_I2C.SDA 配置 P3.7
MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P3、GPIO_PIN7、GPIO_PRIMARY_MODULE_Function);
//配置为 P5.1的上拉电阻使能引脚
MAP_GPIO_setAsInputPinWithPullUpResistor (GPIO_PORT_P5、GPIO_PIN1);
//为 P5.1启用中断
MAP_GPIO_enableInterrupt (GPIO_PORT_P5、GPIO_PIN1);
//为 P5.1选择中断边沿(高到低)
MAP_GPIO_interruptEdgeSelect (GPIO_PORT_P5、GPIO_PIN1、GPIO_HIGH_TO_LOW_TRANSITION);
stopSent_B0 = 0;
I2C_initMaster (EUSCI_B0_BASE、&i2cConfig_B0);
I2C_setSlaveAddress (EUSCI_B0_BASE、SLAVE_ADDRESS);
I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit 模式);
I2C_enableModule (USCI_B0_BASE);
I2C_clearInterruptFlag (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit _INTERRUPT0 + EUSCI_B_I2C_Receive_INTERRUPT0);
INTERRUPT_enableInterrupt (INT_EUSCIB0);
}
void MPU6050_ReadReg (uint8_t RegAddress、uint8_t length)
{
stopSent_B0 = 0;
正在发送_B0 = 0;
num_for_REC_Bytes_B0 =长度;
如果(长度==1)
单个= 1;
其他
单个= 0;
I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit 模式);
I2C_masterSendMultiByteStart (EUSCI_B0_BASE、RegAddress);
I2C_enableInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit INTERRUPT0);
xferIndex_B0 = 0;
while (!stopSent_B0);
返回((RXData_B0[0]<< 8)+ RXData_B0[1]);
返回0;
}
void MPU6050_WriteReg (uint8_t RegAddress、uint8_t* TxBuffer、uint8_t length)
{
正在发送_B0 = 1;
stopSent_B0 = 0;
TXByteCtr =长度;
TXDataPTR_B0 =&TXData_B0[0];
I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit 模式);
I2C_masterSendMultiByteStart (EUSCI_B0_BASE、RegAddress);
I2C_enableInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit INTERRUPT0);
while (!stopSent_B0);
}
空 EUSCIB0_IRQHandler (空)
{
uint_fast16_t status;
STATUS = MAP_I2C_getEnabledInterruptStatus (EUSCI_B0_BASE);
MAP_I2C_clearInterruptFlag (EUSCI_B0_BASE、STATUS);
IF (STATUS & EUSCI_B_I2C_Transmit _INTERRUPT0)
{
IF (发送_B0)
{
IF (TXByteCtr)
{
/*发送下一个数据并递减字节计数器*/
MAP_I2C_masterSendMultiByteNext (EUSCI_B0_BASE、* TXDataPtr_B0++);
TXByteCtr B0--;
}否则
{
MAP_I2C_masterSendMultiByteStop (EUSCI_B0_BASE);
stopSent_B0 = 1;
}
}
其他
{
I2C_DisableInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit INTERRUPT0);
I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Receive_mode);
I2C_masterReceiveStart (EUSCI_B0_BASE);
I2C_enableInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Receive_INTERRUPT0);
}
}
/*将字节接收到接收缓冲区中。 如果我们已接收所有字节、
*发送停止条件*/
IF (STATUS & EUSCI_B_I2C_Receive_INTERRUPT0)
{
if (xferIndex_B0 = NUM_OF_REC_Bytes_B0 - 2)
{
///map_I2C_DisableInterrupt (EUSCI_B1_base、EUSCI_B_I2C_Receive_INTERRUPT0);
///map_I2C_enableInterrupt (EUSCI_B1_base、EUSCI_B_I2C_STOP_INTERRUPT);
/*
*切换顺序,以便在接收最后一个时设置 STOP
*字节读取字节、以便可以读取下一个字节。
*
MAP_I2C_masterReceiveMultiByteStop (EUSCI_B0_BASE);
RXData_B0[xferIndex_B0++]= MAP_I2C_masterReceiveMultiByteNext (
EUSCI_B0_BASE);
}
否则、如果(xferIndex_B0 = NUM_OF_REC_Bytes_B0 - 1)
{
RXData_B0[xferIndex_B0++]= MAP_I2C_masterReceiveMultiByteNext (EUSCI_B0_BASE);
I2C_DisableInterrupt (EUSCI_B0_BASE、EUSCI_B_I2C_Receive_INTERRUPT0);
I2C_setMode (EUSCI_B0_BASE、EUSCI_B_I2C_Transmit 模式);
xferIndex_B0 = 0;
stopSent_B0 = 1;
}
其他
{
RXData_B0[xferIndex_B0++]= MAP_I2C_masterReceiveMultiByteNext (
EUSCI_B0_BASE);
}
}
否则、如果(STATUS & EUSCI_B_I2C_STOP_INTERRUPT)
{
MAP_I2C_DisableInterrupt (EUSCI_B0_BASE、
EUSCI_B_I2C_STOP_INTERRUPT);
}
}
