| 
				
				Xin trợ giúp về giao tiếp dsPICMC710 với dual port RAM CY7C09349AV
			 
 Chào các bạn,Mình đang làm 1 cái project giao tiếp dsPIC với dual-port RAM CY7C09349AV. Đây là RAM đồng bộ, thời gian truy xuất 9ns (xin xem file đính kèm);
 dsPIC MC710 được cấu hình hoạt động ở 40MIPS. Vì là giao tiếp song song nên mình cấu hình cho dsPIC như sau:
 dung lượng RAM: 4kx18, nhưng mình chỉ dùng 256x18, nên chỉ có 8 đường địa chỉ.
 RG2-RG3: A0-A1
 RG6-RG9: A2-A5
 RG12-RG13: A6-A7
 Data bus: dùng 16 đường trên tổng số 18 đường data của RAM, (D8 và D17 của RAM nối Vcc)
 RA0-RA7: D0-D7
 RD8-RD15: D9-D16
 Control signals:
 RA14: Clock : tín hiệu đồng bộ
 RA15: RW: tín hiệu read/write
 RG14: CE : Chip enable
 RG15: OE: Open enable, tín hiệu này kéo xuống low khi đọc từ RAM để cho phép data xuất ra khỏi RAM
 Các chân điều khiển, data và address không dùng được nối mức cao.
 Tổng cộng 28 chân được dùng cho giao tiếp.
 
 Các hàm truy xuất mình viết như sau
 
 //my code define
 #define CLK	 LATAbits.LATA14 //trigger every HIGH signal
 #define RWL	 LATAbits.LATA15 //LOW for WRITE, HIGH for read
 #define CE	 LATGbits.LATG14 //Active HIGH
 #define OEL  LATGbits.LATG15 //Active LOW, for read
 
 #define Convert(add) ((add<<6)&0x3000)|((add<<4)&0x03C0)|((add<<2)&0x00  03)
 
 #define HI 1
 #define LO 0
 
 void InitConfig(){
 int16_T statRead = 0;
 
 //Address, CE, OE output
 statRead= TRISG;
 TRISG = statRead&(~0xF3CC);
 
 //Clock, RW output
 statRead= TRISA;
 TRISA = statRead&(0x3FFF);
 
 CE	=	HI;
 //OEL	=	LO;
 
 /* Configuration ADCHS */
 AD1PCFGL = (0);
 AD1PCFGH = AD1PCFGH|(0x00C0);
 AD2PCFGL = (0);
 
 }
 void ConfigRead(){
 int16_T statRead = 0;
 
 //data input
 statRead= TRISA;
 TRISA = statRead|(0x00FF);
 statRead= TRISD;
 TRISD = statRead|(0xFF00);
 RWL	=	HI;
 OEL	=	LO;
 }
 
 void ConfigWrite(){
 int16_T statRead = 0;
 
 //data input
 statRead= TRISA;
 TRISA = statRead&(~0x00FF);
 statRead= TRISD;
 TRISD = statRead&(~0xFF00);
 
 RWL	=	LO;
 OEL	=	HI;
 
 }
 
 uint16_T Read(uint8_T address){
 // ConfigRead before running this code
 
 uint16_T data;
 uint8_T i;
 //OEL	=	LO;
 LATG=	(LATG&0xCC33)|(Convert(address));
 CLK	=	HI; //trigger the memory
 for(i=0;i<2;i++); //wait for 1 us ??
 data=	(PORTD&0xFF00)|(PORTA&0x00FF); //data on the bus
 CLK	=	LO;
 return data;
 }
 
 void Write(uint8_T address, uint16_T data){
 uint8_T i;
 // ConfigRARDOutput before running this code
 //OEL	=	HI;
 LATG=	(PORTG&0xCC33)|(Convert(address));
 
 LATD=	(PORTD&0x00FF)|(data&0xFF00); //keep RD0-RD7
 LATA=	(PORTA&0xFF00)|(data&0x00FF); //keep RA8-RA15
 CLK	=	HI; //trigger the memory
 for(i=0;i<2;i++); //wait for 1 us ??
 CLK	=	LO;
 }
 
 Mình đã cố gắng thay đổi thời gian chờ của xung CLK (vòng lặp for) để đồng bộ tín hiệu nhưng vẫn không truy xuất được RAM.
 Bạn nào có kinh nghiệm xin vui lòng góp ý, chân thành cảm ơn.
 Positive feedbacks are welcome, thanks alot.
 |