Cấu hình các chân P1.6 và P1.7 cho giao tiếp I2C

dangkhoa913

Trứng gà
các a chị cho e hỏi là khi giao tiếp I2C muốn sử dụng điện trở nội kéo lên thì thì các chân P1.6 và P1.7 phải cấu hình như thế nào ?
e sử dụng thư viện I2C của CLB để giao tiếp I2C với SRF10 nhưng sau chương trình cứ bị dừng ngay vòng while(IFG2..
đây là code trong ct main mong a chị giúp đở :-s:-s:-s:-s
#include <msp430g2553.h>
#include "Basic_config.h"
#include "I2C.h"
unsigned char datawr[]={0x51};
unsigned char datarev[3];
void main()
{
Config_stop_WDT();
Config_Clocks();
//lcd_init ();
P1DIR |=BIT0;
P1OUT &=~BIT0;
P1DIR |= BIT6 + BIT7 ; // Set SCL, SDA as Output
P1REN |= BIT6 + BIT7; // enable Pull-Ups or down on SCL and SDA
P1OUT |= BIT6 + BIT7; // Set Pull-Ups on SCL and SDA
i2c_init(0xE0);
i2c_write(0x00,1,datawr);
__bis_SR_register(GIE);

while (1)
{
i2c_read(0X2,2,datarev);
P1OUT |=BIT0;
}
}

/******************************************************************************
* END OF UART_LCD_main.c
*****************************************************************************/
 

honghiep

Cố Vấn CLB
Staff member
Về cơ bản thì bạn đã config được trở kéo nội cho 2 chân P1.6 và P1.7.
Tuy nhiên, thông thường để giao tiếp I2C tốt hơn, người ta thường dùng trở kéo ngoài, giá trị khoảng vài KOhm đến vài chục KOhm vì trở kéo nội có giá trị lớn, khoảng vài trăm KOhm. Với I2C, trở kéo ngoài thường dùng là 3k3, 4k7,...
Vì I2C dễ bị nhiễu nên các dây SDA, SCL, GND thường được xoắn lại với nhau để giàm nhiễu
 

dangkhoa913

Trứng gà
vâng anh HongHiep e cung có thử kéo điện trở ngoài rồi nhưng mà cung không được cứ bị dùng ở vòng lặp while(..
e thử giao tiếp với ds1307 thì được còn khi gắn vào srf10 thì nó lại bị dừng ngay vòng lăp while không thoát ra được ?:-s:-s:-s
 

dangkhoa913

Trứng gà
với lại cho e hoi là file I2C.c của CLB là khi nhạp địa chỉ cho ds1307 là địa chi 7 bit nhưng khi giai tiep voi srf10 thi địa chi là 0XE0 dzay có ảnh hưởng gì ko a Honghiep :-s:-s:-s:-s:2cool_after_boom:
 

honghiep

Cố Vấn CLB
Staff member
Nếu là 0xE0 thì bạn phải dịch phải 1 bit nữa. Vì địa chỉ I2C chỉ có 2 loại là 10 bit và 7 bit thôi. Ở đây sài 7 bit
 

dangkhoa913

Trứng gà
dich trái hay dịch phải a honghiep :(
nó chỉ ảnh hưởng ở dòng lệnh này thôi hả a ? i2c_init(0xE0); :-s
e sửa lại như thế này có đúng không a
i2c_init(0xe<<1);
và thư viện I2C.c là
/******************************************************************************
*
* WWW.PAYITFORWARD.EDU.VN
*
******************************************************************************/

/******************************************************************************
*
* C7 TRAINING
*
******************************************************************************/

/******************************************************************************
*
* Module : I2C Interface
* Description : Support some I2C functions for the communication with other chips
*
* Tool : CCS 5.1
* Chip : MSP430G2553
* History : 16-11-2012
* Version : 1
*
* Author : THXN-PC
* Notes : Remove the jumper connecting with PIN P1.6
*
*
******************************************************************************/
/* Cac chan I2C cua MSP430G2553 */
//
// -----------------
// /|\| XIN|-
// | | |
// --|RST XOUT|-
// | |
// | |
// | |
// | SCL/P1.6|------->
// | SDA/P1.7|------->
// | |
// | |
// | |
// -------------------
//
//Note: Rut Jumper noi loi LED noi voi chan P1.6 ra ngoai!
//Ko can dien tro keo len. Vi MSP ben trong da co san, chung ta chi can
//khai bao su dung cac dien tro keo len trong chuong trinh!



#include "msp430G2553.h"

void i2c_init(unsigned char sla_add)
{
P1SEL |= BIT6 + BIT7; // Assign I2C pins to USCI_B0
P1SEL2|= BIT6 + BIT7; // Assign I2C pins to USCI_B0


UCB0CTL1 |= UCSWRST; // Enable SW reset
UCB0CTL0 =UCMST+UCMODE_3+UCSYNC; // I2C Master, synchronous mode
UCB0CTL1 = UCSSEL_2+UCSWRST; // Use SMCLK, keep SW reset
UCB0BR0 = 12; // fSCL = SMCLK/12 = ~100kHz
UCB0BR1 = 0;
UCB0I2CSA = sla_add; // Set slave address
UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation
}
void i2c_read(unsigned char AddRes,unsigned char numbyte,unsigned char *poirev)
{
while (UCB0CTL1 & UCTXSTP); // Loop until I2C STT is sent
UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX, start condition

while (!(IFG2&UCB0TXIFG));
UCB0TXBUF = AddRes; // Address start
while (!(IFG2&UCB0TXIFG));

UCB0CTL1 &= ~UCTR; // I2C RX
UCB0CTL1 |= UCTXSTT; // I2C start condition
IFG2 &= ~UCB0TXIFG; // Clear USCI_B0 TX int flag

while (UCB0CTL1 & UCTXSTT); // Loop until I2C STT is sent
while (!(IFG2&UCB0RXIFG));
unsigned char i;
for( i=0;i<numbyte;i++)
{
*(poirev+i)= UCB0RXBUF;
while (!(IFG2&UCB0RXIFG));
}


UCB0CTL1 |= UCTXSTP; // I2C stop condition after 1st TX

}
void i2c_write(unsigned char AddRes,unsigned char numbyte, unsigned char *poisend)
{
while (UCB0CTL1 & UCTXSTP); // Loop until I2C STT is sent
UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX, start condition

while (!(IFG2&UCB0TXIFG));
UCB0TXBUF = AddRes;
// UCB0TXBUF=0;
while (!(IFG2&UCB0TXIFG));
unsigned char i;
for( i=0;i<numbyte;i++)
{
UCB0TXBUF= *(poisend+i) ;
while (!(IFG2&UCB0TXIFG));
}
UCB0CTL1 |= UCTXSTP; // I2C stop condition after 1st TX
IFG2 &= ~UCB0TXIFG; // Clear USCI_B0 TX int flag
}
 

dangkhoa913

Trứng gà
với lại khi mình dịch phải như vậy thì địa chỉ của slave bi thay đổi rồi sao a ? hjc e thử nhìu cách mà ko ra :-s:-s:-s:-s:-s:-s:-s:la:
 
Top