Professional Documents
Culture Documents
Giao tip v truyn nhn d liu l mt nhu cu khng th thiu trong h thng
nhng.
Tuy nhin c im ca cc UART l gi nhn d liu theo tng byte. Trong khi d
liu truyn nhn thng cha nhiu thng tin hn. Do vy gii php c a ra l
ng gi d liu thnh cc gi tin (thng m mng k t) v truyn i.
Gi tin do ngi pht trin t nh ngha, chng hn khi gi nhn d liu t cm
bin accerometer ln my tnh qua UART, mnh thng dng mt gi tin nh sau:
X[data trc x]Y[data trc y]Z[data trc z]
Trong X,Y,Z l cc k t dng nhn bit, data cc trc c chuyn thnh
dng char. Tt c c lu thnh mt mng.
Do UART truyn nhn lin tc nn nhn ra gi tin cn thm cc k t nh
du. Cc k t ny c gi l Flag byte. Flag byte l mt byte mang gi tr c
bit s dng bo hiu frame bt u hoc kt thc.
K thut s dng Flag byte v stuffing byte
Flag byte l mt byte mang gi tr c bit s dng bo hiu frame bt u hoc
kt thc.
Gi s cn gi mt bn tin di ty , ta thm vo u v cui bn tin y cc Flag
bytes. (Vic ny thc hin thit b truyn gi l m ha d liu, sau khi bn tin
c truyn i th phn nhn s thc hin gii m v ly cc thng tin cn thit).
Mt s im cn lu
SPI Protocol
SPI vit tt ca Serial Peripheral Interface, SPI bus Giao din ngoi vi ni tip, bus
SPI. Chun SPI c pht trin bi Motorola. y l mt chun ng b ni tip
truyn d liu ch song cng ton phn (full- duplex) tc trong cng mt thi
im c th xy ra ng thi qu trnh truyn v nhn. i khi SPI cn c gi l
chun giao tip 4 dy (Four-wire).
SPI l giao din ng b, bt c qu trnh truyn no cng c ng b ha vi tn
hiu clock chung. Tn hiu ny sinh ra bi master.
Nguyn l hot ng
bt u hot ng th ko chn SS xung thp v kch hot clock c Maser v
Slave.
I2C Protocol
IC, vit tt ca t ting Anh Inter-Integrated Circuit, l mt loi bus ni tip c
pht trin bi hng sn xut linh kin in t Philips. Ban u, loi bus ny ch c
dng trong cc linh kin in t ca Philips. Sau , do tnh u vit v n gin ca
n, IC c chun ha v c dng rng ri trong cc m un truyn thng ni
tip ca vi mch tch hp ngy nay.
Cu to v nguyn l hot ng
IC s dng hai ng truyn tn hiu:
Mt ch mt t.
Mt ch nhiu t.
Nhiu ch nhiu t.
B3: Gi a ch thanh ghi cn truy nhp ca thit b cng nh ch read hay write.
B4: Gi hoc nhn 1byte d liu. Sau khi truyn 1byte d liu, bn nhn c d liu
s gi li 1bit ACK xc nhn nhn c d liu v tip tc truyn hoc bit
NACK bo nhn c d liu nhng kt thc qu trnh truyn.
Gi tr tr pull up ph hp cn m bo 2 yu t:
Tha mn ph hp mc logic
m bo rise time ca tn hiu.
IC nhn ra ng mc logic th gi tr in p ti chn phi ln hn VOL. Ta c
cng thc tnh tr min nh sau:
T ta c RMAX l
V d v tnh tr pull up
i2c_dly();
SDA = 0;
i2c_dly();
SCL = 0;
i2c_dly();
}
// Hm stop to ra tn hiu stop bng cch ko SDA ln cao khi SCL ang mc cao.
void i2c_stop(void)
{
SDA = 0;
// i2c stop bit sequence
i2c_dly();
SCL = 1;
i2c_dly();
SDA = 1;
i2c_dly();
}
// Hm nhn d liu 1byte.
// Input l bit ACK,
// Output l mt byte c kiu unsigned char.
// ack = 1 => tip tc c
// ack = 0 => nack => kt thc vic c.
unsigned char i2c_rx(char ack)
{
char x, d=0;
SDA = 1;
for(x=0; x<8; x++) // Ln lt c tng bit.
{
d <<= 1;
do
{
SCL = 1;
}while(SCL_IN==0); // i xung sn ln ca SCL.
i2c_dly();
if(SDA_IN) d |= 1; // c SDA v chuyn bit ny vo d (1 th ghi 1, 0 gi nguyn)
SCL = 0;
}
if(ack) SDA = 0;
else SDA = 1;
SCL = 1;
i2c_dly();
// send (N)ACK bit
SCL = 0;
SDA = 1;
return d;
}
// Ham truyn d liu l mt bye c gi tr d
// Gi tr tr v l bit ACK.
bit i2c_tx(unsigned char d)
{
char x;
static bit b;
for(x=8; x; x--) {
if(d&0x80) SDA = 1; // Truyn t bit cao xung bit thp. 0x80 = 1000 0000
else SDA = 0;
SCL = 1;
d <<= 1;
SCL = 0;
}
SDA = 1;
SCL = 1;
i2c_dly();
b = SDA_IN;
// possible ACK bit
SCL = 0;
return b;
}
Phn tip theo l ng dng code I2C trn thc hin vic giao tip d liu vi
SRF08
i2c_start();
// send start sequence
i2c_tx(0xE0);
// SRF08 I2C address with R/W bit clear
i2c_tx(0x00);
// SRF08 command register address
i2c_tx(0x51);
// command to start ranging in cm
i2c_stop();
// send stop sequence
//Now after waiting 65mS for the ranging to complete (I've left that to you) the
following example shows how to read the light sensor value from register 1 and the
range result from registers 2 & 3.
i2c_start();
// send start sequence
i2c_tx(0xE0);
// SRF08 I2C address with R/W bit clear
i2c_tx(0x01);
// SRF08 light sensor register address
i2c_start();
// send a restart sequence
i2c_tx(0xE1);
// SRF08 I2C address with R/W bit set
lightsensor = i2c_rx(1); // get light sensor and send acknowledge. Internal register
address will increment automatically
// Ch , Khi c lin tip 2 ln th sensor s t ng chuyn sang thanh ghi k tip
// Trong v d ny, thanh ghi u tin ch vo lightsenssor, thanh ghi th 2 lu gi
// tr ca rangehing v thanh ghi k tip l ranglow.
rangehigh = i2c_rx(1); // get the high byte of the range and send acknowledge.
rangelow = i2c_rx(0);
// get low byte of the range - note we don't acknowledge
the last byte.
i2c_stop();