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.
尊敬的先生:
我不熟悉 I2C。
我有一个定制电路板 TMS570LS3137-TMS570LSB EP。 在板上、我有一个外部温度 IC (TMP117)。
我随附了微控制器和 TMP117的定制电路板原理图
在 R67 --> SCL 处
在 R68 --> SDA 处
我将在示波器中捕获 SCLK 和数据、并同时附加快照
在 GUI 中读取温度数据时、系统出错了。
在 GUI 温度值*0.0625 =我的实际温度(根据数据表)
我还附加了代码
哪里出了问题、请帮我
/*包含文件*/
#include "stdio.h"
#include "sys_common.h"
#include "system.h"
#include "Gio.h"
#include "sci.h"
#include "reg_het.h"
#include "reg_sci.h"
#include "reg_gio.h"
#include "sys_vim.h"
#include "system.h"
#包含
#include "ADC.h"
#include "reg_adc.h"
#include "stdlib.h"
#include "mibspi.h"
#include "sys_vim.h"
#include "reg_mibspi.h"
#include "reg_gio.h"
#include "i2c.h"
#define TSIZE1 12
UINT8 text1[TSIZE1]={'\r'、'\n'、'|'、'\t'、'C'、'H'、'.'、'I'、'D'、'=''、'0'、'x'};
#define TSIZE2 9
Uint8 text2[TSIZE2]={'\t'、'V'、'A'、'L'、'U'、'E'、'='、'0'、'x'};
#define DATA_COUNT 2
#define Master_Address 0x26
#define Slave_Address 0x8
#define Slave_Word_ 0x450000
#define RECEIVE_DATA_setup 0x1 // 1个字地址
uint8_t TX_DATA_COUNT] Data_Master ={0x10、0x11、0x12、0x13、0x14、0x15、0x16、0x17、0x18、0x19};
Uint8 RX_UART[DATA_COUNT] Data_Master ={0};
uint8_t TX_TX_TX[10] Data_Slave ={0x20、0x21、0x22、0x23、0x24、0x25、0x26、0x27、0x28、0x29};
uint8_t RX_UCC110[10] Data_Slave ={0};
#define TMP117_ADDRESS 0x48 //在 PCF8570中、所有 A0、A1、A2都连接到3.3V
/*用户代码开始(1)*/
/*用户代码结束*/
/**@fn void main (void)
*@简介应用程序主要功能
*@注意此功能默认为空。
*
*此函数在启动后调用。
*用户可以使用此函数来实施应用程序。
*/
静态 unsigned char 命令;
/*用户代码开始(2)*/
/*用户代码结束*/
uint8 emacAddress[6U]={0xFFU、0xFFU、0xFFU、0xFFU、0xFFU、 0xFFU};
UINT32 emacPhyAddress = 0u;
adcData_t ADC_data[2];
void sciDisplayText (scibase_t * sci、uint8 *文本、uint32长度);
void sciDisplayData (scibase_t *sci、uint8 *text、uint32 length);
空等待(UINT32时间);
#define ADC_DATA_LENGTH 1
空 main (void)
{
_enable_irq();
sciInit();
// adcInit ();
gioInit ();
hetInit ();
mibspiInit ();
// i2cInit ();
i2cInit();
sciSend (scilinREG、5、(unsigned char *)"ENTC\n\n");
sciReceive (scilinREG、1、(unsigned char *)&COMMAND);
//adcStartConversion (adcREG1、adcGROUP1);
//***** IIC IIC
int repeat = 0;int delay = 0;
/* I2C 初始化、根据 GUI
*模式=主设备-发送器
*波特率= 100KHz
*计数= 10
*位数= 8位
*/
// i2cInit ();
//主传输功能//
/*配置要与之通信的从器件地址*/
i2cSetSlaveAdd (i2cREG1、TMP117_ADDRESS);
/*设置到发送器的方向*/
/*注:可选-在 Init 中完成*/
i2cSetDirection (i2cREG1、I2C_TRANSMIT);
////将方向设置为接收器
// i2cSetDirection (i2cREG1、I2C_receiver);
/*配置数据计数*/
/*数据计数+ 1 (字地址)*/
i2cSetCount (i2cREG1、1);
/*将模式设置为主模式*/
i2cSetMode (i2cREG1、I2C_MASTER);
/*编程计数后设置停止*/
i2cSetStop (i2cREG1);
/*发送启动条件*/
i2cSetStart (i2cREG1);
/*发送字地址*/
i2cSendByte (i2cREG1、0x00);
/*轮询模式下发送 data_count 数据的数量*/
// i2cSend (i2cREG1、1、0x00);
/*等待清除总线忙状态*/
while (i2cIsBusy (i2cREG1)== true);
/*等待直到检测到停止*/
while (i2cIsStopDetected (i2cREG1)=0);
/*清除停止条件*/
i2cClearSCD(i2cREG1);
/*开始下一个块之前的简单 Dealya */
/*取决于从设备准备就绪的速度*/
for (delay=0;delay<1000;delay++);
//主机接收功能//
/ /
/ /
/*等待 MST 位被清除、这将持续
*清除总线忙状态后几个周期*/
/* while (i2cIsMasterReady (i2cREG1)!= true);
/*配置要与之通信的从器件地址*/
// i2cSetSlaveAdd (i2cREG1、TMP117_ADDRESS);
//
///*设置到发送器的方向*/
///*注:可选-在 Init 中完成*/
// i2cSetDirection (i2cREG1、I2C_TRANSMIT);
//
///*配置数据计数*/
///*读取前的从器件地址+字地址写入操作*/
// i2cSetCount (i2cREG1、0x91);
//
///*将模式设置为主模式*/
// i2cSetMode (i2cREG1、I2C_MASTER);
//
///*编程计数后设置停止*/
// i2cSetStop (i2cREG1);
//
///*发送启动条件*/
// i2cSetStart (i2cREG1);
//
///*发送字地址*/
// i2cSendByte (i2cREG1,Slave_Word_);
//
///*等待清除总线忙状态*/
// while (i2cIsBusBusy (i2cREG1)== true);
//
///*等待检测到停止*/
// while (i2cIsStopDetected (i2cREG1)=0);
//
///*清除停止条件*/
// i2cClearSCD(i2cREG1);
//
//***** /
//***** /
//
////*等待 MST 位被清除,这将采用
//*清除总线忙状态后几个周期*/
// while (i2cIsMasterReady (i2cREG1)!= true);
/*配置要与之通信的从器件地址*/
i2cSetSlaveAdd (i2cREG1、TMP117_ADDRESS);
/*设置到接收器的方向*/
i2cSetDirection (i2cREG1、I2C_receiver);
/*配置数据计数*/
/*注:可选-它在 Init 中完成,除非用户想要更改*/
i2cSetCount (i2cREG1、3);
/*将模式设置为主模式*/
i2cSetMode (i2cREG1、I2C_MASTER);
/*编程计数后设置停止*/
i2cSetStop (i2cREG1);
/*发送启动条件*/
i2cSetStart (i2cREG1);
// uint32_t u[2];
/*轮询模式下发送 data_count 数据的数量*/
i2cReceive (i2cREG1、2、RX_REF1 Data_Master);
// uint16_t tematureData;
// i2cReceive (i2cREG1、3、(uint8_t*)&TematureData);
uint32_t k;
// j=((RX_VIN[1]<<8 Data_Master)+ RX_VIN[0] Data_Master);
对于(k = 0;k < 2;k++)
{
//将 ADC 值转换为十进制字符串表示
char adcValueStrr[4];//假设最大的 ADC 值适合5位数字加上一个空端接器。
// j =j>>4 ;
//j=j;
//将 adcValueStr 转换为整数
// int adcValue =(int) strtol (adcValueStrr、NULL、10);
sprintf (adcValueStrr、"%x"、RX_VREF[k] Data_Master);
// sprintf (adcValueStrr1、"%x"、u[k]);
//通过 SCI 将 ADC 值发送到 GUI
sciSend (scilinREG、strlen (adcValueStrr)、(uint8_t*) adcValueStrr);
// sciSend (scilinREG、strlen (adcValueStrr1)、(uint8_t*) adcValueStrr1);
sciSend (scilinREG、2、"\r\n");
}
/*等待清除总线忙状态*/
while (i2cIsBusy (i2cREG1)== true);
/*等待直到检测到停止*/
while (i2cIsStopDetected (i2cREG1)=0);
/*清除停止条件*/
i2cClearSCD(i2cREG1);
// asm (" nop");
// asm (" nop");
// asm (" nop");
while (1);
{
}
////*用户代码开始(13)*/
///*用户代码结束*/
}
尊敬的 Balu:
中的 GUI 温度值*0.0625 =我的实际温度(根据数据表)
TMP117的温度分辨率为0.0078125而不是0.0625。
可能这会为您提供错误的结果。
如果我乘以正确的分辨率、那么值0x0D9B 为27.21C。
--
谢谢。此致、
Jagadish。