-
弱弱的问一句,结贴怎么操作?
-
本帖最后由 尘埃未定 于 2014-12-17 11:47 编辑
感谢大家的耐心解答!
-
本帖最后由 尘埃未定 于 2014-12-17 11:47 编辑
感谢大家的耐心解答!
-
到现在也没有解决,请问各位有没有什么建议?
-
deweyled 发表于 2014-12-14 14:56
根据你的描述,这个模拟的I2CMaster是可以正常访问 ADS1100和其他一些Slave的,那是不是应该查查你的430实现的I2Cslave是不是有问题?
这个应该不是吧,因为使用430自带的I2C接口做主机读取这个430的从机就没问题,他们之间就差这个地址的响应脉冲,甚是奇怪
-
有人知道问题出在哪里吗?
-
出问题的地方是 if(WriteByte(0X91) == ACK) ,但是检查了半天,怎么也看不出哪里不对,把程序放到ADS1100上用也没问题。
-
程序如下:
#include
#define SCL_H SCL_IN
#define SCL_L SCLPullDown()
#define SDA_H SDA_IN
#define SDA_L SDAPullDown()
#define SCL_OUT P1DIR |= BIT6
#define SDA_OUT P1DIR |= BIT7
#define SDA_IN P1DIR &= ~BIT7
#define SCL_IN P1DIR &= ~BIT6
#define SDA_VAL P1IN & BIT7
#define SCL_VAL P1IN & BIT6
#define ACK 0X00
#define NACK 0X01
#define ADSADDRESS 0X01
void InitializeClock();
void Start();
void Stop();
unsigned char WriteByte(unsigned char command);
unsigned char ReadByte();
unsigned char CheckACK();
void MACK();
void NMACK();
void Write1();
void Write0();
void SDAPullDown();
void SCLPullDown();
void UartRegCfg();
void UartGpioCfg();
void UartInit();
void UARTPutChar(unsigned char cTX);
void UARTPutstring( char *str);
void main(void) {
volatile float voltage = 0;
volatile unsigned char MSB, LSB, parameters;
volatile unsigned int msb, lsb;
volatile char VOL[4];
volatile unsigned int vol;
UartInit();
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
InitializeClock();
while(1) {
Start();
if(WriteByte(0X91) == ACK) {
MSB =ReadByte();
MACK();
LSB = ReadByte();
NMACK();
Stop();
}
_delay_cycles(800000);
}
}
void InitializeClock(){
BCSCTL1 = CALBC1_8MHZ;
DCOCTL = CALDCO_8MHZ;
}
void Start() {
SDA_H;
_delay_cycles(100);
SCL_H;
_delay_cycles(100);
SDA_L;
_delay_cycles(100);
SCL_L;
_delay_cycles(100);
}
void Stop() {
SDA_L;
_delay_cycles(100);
SCL_H;
_delay_cycles(100);
SDA_H;
_delay_cycles(100);
SCL_L;
_delay_cycles(100);
}
unsigned char WriteByte(unsigned char command) {
unsigned char temp, count, ACKFlag;
for (count = 8; count > 0; count--) {
temp = command & 0x80;
if (temp)
Write1();
else
Write0();
command
-
deweyled 发表于 2014-12-12 23:32
I2C总线在空闲的时候应该为高的吧?你量一下硬件I2C的波形看看。
请版主看第一个图,地址发送完毕后,SDA是被从机拉低了,但是响应位的SCL却丢失了一个脉冲,这个脉冲程序中我是有的。在请看第二个图,地址不变,我将最后一位读指令换成写指令,从机就有了响应,下图比上图多一个脉冲。
-
这个程序之前用在ADS1100上没有问题,将主函数略加修改用在SHT21和CPS131气压传感器上也没有问题,但是不知为何在做I2C从机的MSP430上却不行,波形上在地址的响应上少了一个脉冲,但是程序中SCL是产生了9个,而地址这里却只出现了8个脉冲,如果我将地址有意写错,SCL丢失的脉冲就出来了,知识SDA维持在高电平而已。不明白用在ADS1100上的程序为什么用在MSP430上就不对,如果我在程序中添加一个脉冲这里就对了,但是程序中的脉冲个数始终和波形的脉冲个数对不上。ADS1100和MSP430的从机地址都是0x48。