主题中讨论的其他器件:BQ32000、 LM92
工具/软件:Code Composer Studio
大家好!
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Code Composer Studio
大家好!
大家好!
感谢您的电子邮件回复和帮助。
现在我不能卡在 ISR_TRAP 中、但我从读取寄存器中获得固定值、并且传感器值不变。
我需要正确读取数据字节低电平和数据字节高电平。
我在 main 函数()中调用 AS
Data1 = I2C_USCI_READ_Word (datareg[0]、2);但它始终在表达式寄存器中为我提供255的固定值
在我的数据和数据1下的代码中、分别是较高和较低的字节。
I2C 库在下面
unsigned char I2C_USCI_READ_Word (unsigned char Addr_Data、unsigned char 长度)
{
uint16_t Data、Data1、alldata;
while (UCB0CTL1 & UCTXSTP); //循环、直到发送 I2C STT
UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX、启动条件
while (!(IFG2&UCB0TXIFG));
IFG2 &=~UCB0TXIFG;
if (UCB0STAT 和 UCNACKIFG)返回 UCB0STAT;
UCB0TXBUF = Addr_Data;
while (!(IFG2&UCB0TXIFG));
if (UCB0STAT 和 UCNACKIFG)返回 UCB0STAT;
UCB0CTL1 &=~UCTR;
UCB0CTL1 |= UCTXSTT;
IFG2 &=~UCB0TXIFG;
while (UCB0CTL1 & UCTXSTT);
while (!(IFG2&UCB0RXIFG));
IFG2 &=~UCB0TXIFG; //清除 USCI_B0 TX int 标志
数据= UCB0RXBUF;
while (!(IFG2&UCB0RXIFG));
IFG2 &=~UCB0TXIFG;//清除 USCI_B0 TX 内部标志
Data1 = UCB0RXBUF;
while (!(IFG2&UCB0RXIFG));
IFG2 &=~UCB0TXIFG;
UCB0CTL1 |= UCTXSTP;
alldata =数据;
alldata |=(Data1)<< 8;
返回所有数据;
}
大家好!
感谢周奕迅的答复。
我注意到另一个问题。 虽然我可以使用 I2C 正确读取寄存器、但寄存器的读取值是不正确的。
void read_worth()
{
Data1 = I2C_USCI_READ_Word (datareg[0]、2);
Data2 = I2C_USCI_READ_Word (datareg[1]、2);
Data3 = I2C_USCI_READ_Word (datareg[2]、2);
Data4 = I2C_USCI_READ_Word (datareg[3]、2);
}
我只能 正确获取 data1值。其余的 data2、data3和 data4不正确、就像所有值都是255一样。
请注意、如果我对所有寄存器进行注释(//)并且只读取 data2值、则 data2将提供正确的结果。
同样,如果我对所有寄存器进行注释并尝试读取 data3值,则 data3将为我提供正确的结果。
数据4也是如此
请查看随附的错误寄存器值 data2、data3、data4的快照。
此致、
Syed Ali。
您好!
感谢周奕迅的回复。 我尝试了一些延迟、但它不起作用。
我所做的是再次添加从器件地址并再次初始化 I2C。 请查看代码并添加快照。
但现在的问题是、在暂停并再次运行后、我无法获取 UART 和持续更改的值。 为了做到这一点、我必须再次刻录代码。
Data1 = I2C_USCI_READ_Word (0x07);
I2C_USCI_SET_Address (VEML6075_address);
I2C_USCI_Init (VEML6075_address);
Data2 = I2C_USCI_READ_Word (0x09);
您好!
周奕迅! 当您要求共享代码时,我将在这里发布代码。
问题是、现在寄存器中的值发生了变化、我得到了正确的值、但问题是 我为什么需要重新分配从地址并进行初始化?
包含
#include
#include
#include
#include
#include
#define VEML6075_address 0x10
#define ACoeff 3.33
#define BCoef 2.5
#define CCoef 3.66 //系数
#define DCoef 2.75
#define UVAresponsivity 0.001461
#define UVBresponsivity 0.002591
uint8_t itime = 50;
unsigned char data[4];
uint16_t data1;
uint16_t data2、data3、data4;
unsigned char datareg[4]={0x07、0x09、0x0A、0x0B};
uint16_t UVA=0、uV=0、UVcomp1=0、UVcomp1=0、UVcomp2=0;
float UVA_calc、UVb_calc、UVI_calc;
void VEML6075_Init()
{
I2C_USCI_Write_Byte (0x00、0x20);
}
void main()
{
WDTCTL = WDTPW | WDTHOLD;
while (1)
{
I2C_USCI_SET_Address (VEML6075_address);
I2C_USCI_Init (VEML6075_address);
VEML6075_Init();
Data1 = I2C_USCI_READ_Word (0x07);
I2C_USCI_SET_Address (VEML6075_address);
I2C_USCI_Init (VEML6075_address);
Data2 = I2C_USCI_READ_Word (0x09);
I2C_USCI_SET_Address (VEML6075_address);
I2C_USCI_Init (VEML6075_address);
Data3 = I2C_USCI_READ_Word (0x0A);
I2C_USCI_SET_Address (VEML6075_address);
I2C_USCI_Init (VEML6075_address);
Data4 = I2C_USCI_READ_Word (0x0B);
UVA = data1;
uVB = data2;
UVcomp1 = data3;
UVcomp2 = data4;
UVA_calc =(UVA -(2.22 * UVcomp1)-(1.33 * UVcomp2));
uVb_calc =(uVB -(2.95 * UVcomp1)-(1.74 * UVcomp2));
UVI_calc =((UVA_calc * 0.001461)+(UVB_calc * 0.002591))/ 2;
Data1 = 0;
Data2 = 0;
Data3 = 0;
Data4 = 0;
_delay_cycles (3000000);
以下为 i2c 代码................................................................................................................................
#include
I2C_USCI_H
#define I2C_USCI_H
#define MPU6050_address 0x68
#define BQ32000_address 0x68
#define DS1307_address 0x68
#define LM92_ADDRESS 0x48
void I2C_USCI_Init (unsigned char addr);//Khoi tao I2C
void I2C_USCI_SET_Address (unsigned char addr);//Thai doi Sia chi 从器件
unsigned char I2C_USCI_READ_Byte (unsigned char 地址);//Doc 1字节
//Doc nhieu Byte
unsigned char I2C_USCI_READ_Word (unsigned char Addr_Data);
//Doc ghi 1字节
unsigned char I2C_USCI_Write_Byte (unsigned char 地址、unsigned char 数据);
//ic LM92 co khung Truyen Hoi Khac so VOI Binh thuong NEN phai dung Ham Rieng
unsigned int read_LM92();
空 I2C_USCI_Init (无符号字符 addr)
{
P1SEL |= BIT6 + BIT7;//将 I2C 引脚分配给 USCI_B0
P1SEL2|= BIT6 + BIT7;//将 I2C 引脚分配给 USCI_B0
UCB0CTL1 |= UCSWRST;//启用 SW 复位
UCB0CTL0 = UCMST+UCMODE_3+UCSYNC;// I2C 主器件、同步模式
UCB0CTL1 = UCSSEL_2+UCSWRST;//使用 SMCLK、保持软件复位
UCB0BR0 = 40;// fSCL = SMCLK/40 =~400kHz
UCB0BR1 = 0;
UCB0I2CSA = addr;//设置从器件地址
UCB0CTL1 &=~UCSWRST;//清除 SW 复位,恢复运行
}
空 I2C_USCI_SET_Address (无符号字符 addr)
{
UCB0CTL1 |= UCSWRST;
UCB0I2CSA = addr;//设置从器件地址
UCB0CTL1 &=~UCSWRST;//清除 SW 复位,恢复运行
}
unsigned char I2C_USCI_READ_Byte (unsigned char 地址)
{
// uint16_t Data=0,Data1=0,alldata=0;
while (UCB0CTL1 & UCTXSTP);// Cho tin Hieu I2C STT Duoc GUI di
UCB0CTL1 |= UCTR + UCTXSTT;// I2C TX、START
while (!(IFG2&UCB0TXIFG));// Cho GUI xong
UCB0TXBUF =地址;// Dia chi Luu Gia 三秒
while (!(IFG2&UCB0TXIFG));// Cho GUI xong
UCB0CTL1 &=~Ω UCTR;// I2C RX
UCB0CTL1 |= UCTXSTT;// I2C 重新启动
IFG2 &=~UCB0TXIFG;// XOA co Ngat USCI_B0 TX
while (UCB0CTL1 & UCTXSTT);// Cho den KHI I2C STT Duoc GUI di
UCB0CTL1 |= UCTXSTP;// GUI 位停止
返回 UCB0RXBUF;
}
unsigned char I2C_USCI_READ_Word (unsigned char Addr_Data)
{
unsigned char i=0;
uint8_t 数据、Data1;
uint16_t alldata;
while (UCB0CTL1 & UCTXSTP);//循环、直到发送 I2C STT
UCB0CTL1 |= UCTR + UCTXSTT;// I2C TX 模式(UCTR=1)、启动条件
while (!(IFG2&UCB0TXIFG));
IFG2 &=~UCB0TXIFG;//清除 USCI_B0 TX 内部标志
if (UCB0STAT 和 UCNACKIFG)返回 UCB0STAT;
UCB0TXBUF = Addr_Data;
while (!(IFG2&UCB0TXIFG));
if (UCB0STAT 和 UCNACKIFG)返回 UCB0STAT;
UCB0CTL1 &=~UCTR;// I2C RX 模式
UCB0CTL1 |= UCTXSTT;// I2C 启动条件
IFG2 &=~UCB0TXIFG;//清除 USCI_B0 TX 内部标志
while (UCB0CTL1 & UCTXSTT);//循环直到发送 I2C STT
while (!(IFG2&UCB0RXIFG));
IFG2 &=~UCB0TXIFG;//清除 USCI_B0 TX 内部标志
数据= UCB0RXBUF;
while (!(IFG2&UCB0RXIFG));
IFG2 &=~UCB0TXIFG;//清除 USCI_B0 TX 内部标志
Data1 = UCB0RXBUF;
while (!(IFG2&UCB0RXIFG));
IFG2 &=~UCB0TXIFG;//清除 USCI_B0 TX 内部标志
UCB0CTL1 |= UCTXSTP;//第1个 TX 之后的 I2C 停止条件
alldata =数据;
alldata |=(Data1)<< 8;
返回所有数据;
}
unsigned char I2C_USCI_Write_Byte (unsigned char 地址、unsigned char 数据)
{
while (UCB0CTL1 & UCTXSTP);
UCB0CTL1 |= UCTR + UCTXSTT;
while (!(IFG2&UCB0TXIFG));// Cho cho 位启动 GUI xong
if (UCB0STAT 和 UCNACKIFG) return UCB0STAT;//Neu bao loi thothat Khoi ham
UCB0TXBUF =地址;// GUI dia chi Thanh ghi can ghi
while (!(IFG2&UCB0TXIFG));
if (UCB0STAT 和 UCNACKIFG)返回 UCB0STAT;
UCB0TXBUF = DATA & 0xFF;
while (!(IFG2&UCB0TXIFG));
if (UCB0STAT 和 UCNACKIFG)返回 UCB0STAT;
UCB0TXBUF = DATA >> 8;
while (!(IFG2&UCB0TXIFG));
if (UCB0STAT 和 UCNACKIFG)返回 UCB0STAT;
UCB0CTL1 |= UCTXSTP;
IFG2 &=~UCB0TXIFG;
返回0;
}
unsigned int read_LM92 ()
{
unsigned char a;
while (UCB0CTL1 & UCTXSTP);//循环、直到发送 I2C STT
UCB0CTL1 |= UCTR + UCTXSTT;// I2C TX、启动条件
while (!(IFG2&UCB0TXIFG));
UCB0TXBUF = 0x00;// Dia chi Luu Gia 三秒
while (!(IFG2&UCB0TXIFG));
UCB0CTL1 &=~Ω UCTR;// I2C RX
UCB0CTL1 |= UCTXSTT;// I2C 启动条件
IFG2 &=~UCB0TXIFG;//清除 USCI_B0 TX 内部标志
while (UCB0CTL1 & UCTXSTT);//循环直到发送 I2C STT
A = UCB0RXBUF;
while (UCB0CTL1 & UCTXSTT);//循环直到发送 I2C STT
UCB0CTL1 |= UCTXSTP;//第1个 TX 之后的 I2C 停止条件
返回((A<<8)|UCB0RXBUF);
}
#endif
您好!
感谢周奕迅的电子邮件回复。。
根据您的建议,我在开头添加了 UCB0CTL1 |= UCT,
unsigned char I2C_USCI_READ_Word (unsigned char Addr_Data)
{
UCB0CTL1 |= UCTR;
uint8_t 数据、Data1;
uint16_t alldata;
while (UCB0CTL1 & UCTXSTP); ........................................................................
和 main()函数中
void main()
{
WDTCTL = WDTPW | WDTHOLD;
I2C_USCI_SET_Address (VEML6075_address);
I2C_USCI_Init (VEML6075_address);
VEML6075_Init();
while (1)
{
Data1 = I2C_USCI_READ_Word (0x07);
Data2 = I2C_USCI_READ_Word (0x09);
Data3 = I2C_USCI_READ_Word (0x0A);
Data4 = I2C_USCI_READ_Word (0x0B);..................}
但我会再次遇到相同的问题。 您可以在快照中看到、只有 data1值是可以的。
现在 ,如果我在读取 data2之前再次添加从地址,那么我将从255……获得更改为的值
如您所见...
此致、
Ali