ASG AT90128 Project 3 rd Team Author Cho Chang yeon <iprinceps@gmail.com> Date 2006-07-31
Contents 1 Introduction... 3 2 Schematic Revision... 4 3 Library... 5 3.1 1: 1 Communication... 5 iprinceps - 2-2006/07/31
1 Introduction 이문서는 Atmel의 AT90128을사용한 ASG Module에 Atmel Lib. 를사용하여 1:1통신을수행하는부분까지를내용으로하고있다. Atmel에서제공하는 Lib. 에대한상세한내용은추후 update할예정이다. 이문서를작성할때참고한문서들은다음과같다. MicroChip MCP2551 Datasheet Atmel AT90128 Datasheet iprinceps - 3-2006/07/31
2 Schematic Revision AT90128은 ZigBee에서사용하는 AVR PCB를그대로사용하였다. Tranceiver로는 Microchip의 MCP2551을사용하는데, 회로도에약간의버그를발견하였다. Schematic. MCP2551 회로도를보면 RS(5번 ) 이 GND에물려있고, VREF는 N.C.(Not Connect) 상태로되어있다. 하지만 Datasheet를보면다음과같은내용이있다. 1.4 Operating Mode를보면 RS pin으로다음세가지모드를선택할수있다고되어있다. High-Speed: RS pin을 VSS(i.e. GND) 에연결 Slope-Control: external register를사용해서 RS를 GND에연결 Standby: RS에 High Level을인가 iprinceps - 4-2006/07/31
Slope-Control mode 시제어선도는다음과같다. Figure. Slew rate vs. Slope-control Resistance Value Operation Mode 에따른 RS pin 의 voltage 는다음표와같다. Terminator 저항은일반적으로 120Ω을 H와 L사이에연결해주면된다. H 와 L을각각 Pull-up, Pull-down해줄필요는없는데, 이는 Idle상태에서는 Transceiver가 H와 L을 2.6V로잡아주기때문이다. 3 Library Atmel의 Lib. v3.1을사용해서 1:1 통신을구현하였다. WinAVR을사용해서구현되어있기때문에, CodeVision으로 build하기위해서는약간의수정이필요하다. 3.1 1: 1 Communication Lib. 를사용해서 Frame을사용해서 LED를키는프로그램이다. message는 st_cmd_t structure를사용한다. Codes. st_cmd_t structure typedef struct{ iprinceps - 5-2006/07/31
U8 handle; can_cmd_t cmd; can_id_t id; U8 dlc; U8* pt_data; U8 status; can_ctrl_t ctrl; } st_cmd_t; 각 field의정의는다음과같다. Field Description handle manage by the library cmd initialized by the application to select the operation id initialized by the application in transmission, complete by the library in reception dlc initialized by the application to give the number of data to, transmit complete by the library in reception pt_data pointer on the table which contains the data to send or received status manage by the library ctrl field ide to signal a extended frame 이구조체를초기화하는 code 는아래와같다. Codes. st_cmd_t initialize st_cmd_t message; message.id.ext = 0x11; // Incrementation of ID to remove possible clashes message.cmd = CMD_TX_DATA; message.dlc = 8; message.ctrl.ide = 1; message.status = 0; message.handle = 0; 통신을하기위해서는 can_init() 을호출해야한다. Codes. can_init() (in a can_lib.c) U8 can_init(u8 mode) { if ((Can_bit_timing(mode))==0) return (0); // c.f. macro in "can_drv.h" iprinceps - 6-2006/07/31
can_clear_all_mob(); // c.f. function in "can_drv.c" Can_enable(); // c.f. macro in "can_drv.h" return (1); } Argument로넘겨주는 mode가 0이면 bit timing을 faster baudrate로부터가져오고, 1이면 BTx register값에서가져오게된다. message.cmd는다음과같은값들을가질수있다. Codes. can_cmt_t enum typedef enum { CMD_NONE, CMD_TX, CMD_TX_DATA, CMD_TX_REMOTE, CMD_RX, CMD_RX_DATA, CMD_RX_REMOTE, CMD_RX_MASKED, CMD_RX_DATA_MASKED, CMD_RX_REMOTE_MASKED, CMD_REPLY, CMD_REPLY_MASKED, CMD_ABORT } can_cmd_t; 각 command의정확한정의는아직파악이되지않았다. 일단 data를전송할때는 _TX_DATA, data를수신할때는 _RX를사용한다. 정의된 command를실행하기위해서는다음 line을실행해야한다. while(can_cmd(&message)!= _CMD_ACCEPTED); can_cmd() 는 can_lib.c에정의되어있으며, 각 command에따라현재상태를설정한다. 상태설정이성공하면실제동작을수행해야하는데, 이것은다음 line을실행함으로써수행된다. while(can_get_status(&message) == _STATUS_NOT_COMPLETED); iprinceps - 7-2006/07/31