กรกฎาคม 19, 2019, 10:31:49 pm *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน
ส่งอีเมล์ยืนยันการใช้งาน?

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
   หน้าแรก   ช่วยเหลือ เข้าสู่ระบบ สมัครสมาชิก  
หน้า: 1 [2]   ลงล่าง
  พิมพ์  
ผู้เขียน หัวข้อ: ตอนนี้ผมมี EEPROM 24LC512 ต่ออยู่กับ ARM LPC1756 ไม่ทราบว่าจะเขียนโปรแกรม เขียนอ่าน ยังไงครับ  (อ่าน 16730 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
anon1206
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 30


| |
« ตอบ #15 เมื่อ: มิถุนายน 19, 2013, 03:27:17 pm »

ตอนนี้ผมได้ศึกษา Port I/O ตามที่พี่บอกมาแล้วครับอยากให้ช่วยดู code ให้หน่อยเพราะตอนนี้ยังไม่ออกเลยครับไม่รู้ตรงไหนมีปัญหา

ส่วนการกำหนดขาและ define ต่าง ๆ
Code: (c)

#define   SDA (1<<0)  //กำหนดขา P0.0 ชื่อ SDA
#define SCL (1<<1) //กำหนดขา  P0.1 ชื่อ SCL

#define MEMDIR LPC_GPIO0->FIODIR          // รีจีสเตอร์  FIODIR    ตั้งชื่อเป็น MEMDIR
#define MEMSEL LPC_PINCON->PINSEL0    // รีจีสเตอร์   PINSEL0  ตั้งชื่อเป็น   MEMSEL
#define MEMSET LPC_GPIO0->FIOSET       // รีจีสเตอร์   FIOSET   ตั้งชื่อเป็น MEMSET
#define MEMCLR LPC_GPIO0->FIOCLR      // รีจีสเตอร์   FIOCLR   ตั้งชื่อเป็น MEMCLR
#define MEMIN  LPC_GPIO0->FIOPIN           // รีจีสเตอร์   FIOPIN     ตั้งชื่อเป็น  MEMIN 

#define SDA0  MEMCLR  =  SDA     //กำหนดให้ขา  SDA  มีลอจิกเป็น 0 ชื่อว่า SDA0
#define SDA1  MEMSET  =  SDA     //กำหนดให้ขา  SDA  มีลอจิกเป็น 1 ชื่อว่า SDA1
#define SCL0  MEMCLR  =  SDA     //กำหนดให้ขา  SCL  มีลอจิกเป็น 0 ชื่อว่า SCL0
#define SCL1  MEMSET  =  SDA      //กำหนดให้ขา  SCL  มีลอจิกเป็น 1 ชื่อว่า SCL1


ฟังก์ชัน I2C_start
Code: (c)

void I2C_start(void)
{
   
   MEMDIR |= SDA;  //กำหนดให้ขา SDA ทำหน้าที่เป็นพอร์ต Output
   SDA1 ; //SDA = 1;       
   SCL1 ; //SCL = 1;
   _delay_ms(10);
   SDA0 ; //SDA = 0;
   _delay_ms(10);
   SCL0 ; // SCL = 0;       
}


ฟังก์ชัน I2C_stop
Code: (c)

void I2C_stop(void)
{
          MEMDIR |= SDA;  //กำหนดให้ขา SDA ทำหน้าที่เป็นพอร์ต Output
   SCL0 ; //SCL = 0;
   _delay_ms(10);
   SDA0 ; //SDA = 0;
   _delay_ms(10);
   SCL1 ; //SCL = 1;
   _delay_ms(10);
   SDA1 ; //SDA = 1;
   _delay_ms(10);         
}


ฟังก์ชันตรวจสอบค่า ack
Code: (c)

int ack_(void)
{
   int bit=0;
          MEMDIR  &= ~SDA;  //กำหนดขา SDA ทำหน้าที่เป็น input
        // กำหนดให้ SCL =0 และ SCL =1 รอการส่งค่า ack จากตัว 24LC512
   SCL0;                // SCL = 0;
   SCL1;                // SCL = 1 ;
          bit = (MEMIN & SDA);  //รับค่า ack ที่ส่งจากจากตัว 24LC512 เก็บไว่ที่ตัวแปร bit

   MEMDIR |= SDA;   //กำหนดให้ขา SDA ทำหน้าที่กลับเป็น output
   return (bit); 
}


ฟังก์ชัน write8bit
Code: (c)

unsigned char write8bit(unsigned char input)
{
   unsigned char temp,q0;      
   MEMDIR |= SDA;    // กำหนดขา SDA เป็น output
   for(temp=8;temp>0;temp--)            
   {
      q0 = input & 0x80;    //นำค่า input ที่รับมาแอนกับ 0x80   
      if(q0 == 0x80) SDA1;   
      else  SDA0;

               _delay_ms(10);                         
      SCL1;
      _delay_ms(10);
      SCL0;       
      input = input<<1;   
   }
   ack_();  //ตรวจสอบค่า ack          
}


ฟังก์ชัน read8bit
Code: (c)

unsigned char read8bit()
{
 unsigned char temp,q0,rbyte=0 ;
        MEMDIR &= ~SDA;   //กำหนดขา SDA เป็น input
 for(temp=8;temp>0;temp--)
 {
    SCL1;     //SCL = 1
   _delay_ms(10);
   rbyte = rbyte<<1;
          MEMDIR &= ~SDA;  //กำหนดขา SDA เป็น input
   q0 = (MEMIN & SDA);
   if(q0 == SDA)
   rbyte = rbyte|0x01;
   _delay_ms(10);
       SCL0;    //SCL = 0
       _delay_ms(10);
  }
 return(rbyte);   
}


ฟังก์ชัน main
Code: (c)

int main(void)
{
unsigned char Whole_Temp[ ];
unsigned char temp;

   SystemInit();
    MEMDIR |=SCL;  //กำหนดให้ขา SCL ทำหน้าที่เป็น output
   
        //เริ่มต้อนการเขียนข้อมูล
        I2C_start();
          write8bit(0xA4);  //ตำแหน่ง address Hardware ที่ต่อคือ 010 จึงได้เป็น 10100100 = 0xA4
          write8bit(0x00);   //ตำแหน่ง address ที่จะทำการเขียนข้อมูล
          write8bit(0x41);   //ข้อมูลที่จะทำการเขียนลง
   I2C_stop();
   //============================================================
        //เริ่มต้นการอ่านข้อมูล
   I2C_start();
   write8bit(0xA4);
   write8bit(0x00);
   I2C_start();
          write8bit(0xA5);  // 10100101 = A5 ทำการเขียนข้อมูล
         temp = read8bit(0x00); //นำข้อมูลที่อ่านไปเก็บที่ temp
   I2C_stop();
   Whole_Temp[0] = temp; 
         UART0_SENT_DATA(Whole_Temp,1);  //ส่งข้อมูลออกไปตรวจสอบผ่าน Serial port
}
บันทึกการเข้า
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8272


ShadowWares


| |
« ตอบ #16 เมื่อ: มิถุนายน 19, 2013, 06:04:38 pm »

อ้างถึง
ตอนนี้ผมได้ศึกษา Port I/O ตามที่พี่บอกมาแล้วครับอยากให้ช่วยดู code ให้หน่อยเพราะตอนนี้ยังไม่ออกเลยครับไม่รู้ตรงไหนมีปัญหา
"ตอนนี้ยังไม่ออกเลยครับ"
อะไรไม่ออก? สัญญาญไม่ออกตามที่ควรจะเป็น หรือ เขียน/อ่านค่าไม่ได้? ค่าที่อ่านมาได้มีค่าเท่าไร?
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
anon1206
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 30


| |
« ตอบ #17 เมื่อ: มิถุนายน 19, 2013, 06:27:28 pm »


อะไรไม่ออก? สัญญาญไม่ออกตามที่ควรจะเป็น หรือ เขียน/อ่านค่าไม่ได้? ค่าที่อ่านมาได้มีค่าเท่าไร?

ผมลองเขียน 0x41ลงไปที่ตำแหน่ง 0x00 และค่าที่อ่านได้จะเป็น 0xFF ตลอดเลยครับ ผมจะทดสอบยังไงครับว่าค่านั้นเขียนลงไปได้แล้ว
หรือโค้ดตรงไหนที่ผมน่าจะเขียนผิดครับ
บันทึกการเข้า
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8272


ShadowWares


| |
« ตอบ #18 เมื่อ: มิถุนายน 20, 2013, 09:35:46 am »

อ่านค่ามาได้เป็น 0xFF นั่นเป็นสัญญาณบอกว่า I2C Device ยังไม่ตอบสนองใดๆ ครับ
จะต้องตรวจสอบว่าสัญญาณต่างๆ ที่ถูกสร้างขึ้นมานั้นถูกต้องตามรูปแบบของ I2C รวมไปถึงค่าต่างๆ ที่ส่งออกไปเพื่อร้องของการเขียน/อ่านกับ I2C Device ด้วย และที่ขาดไม่ได้คือ Hardware จะต้องถูกต้อง
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
anon1206
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 30


| |
« ตอบ #19 เมื่อ: มิถุนายน 20, 2013, 10:31:27 am »

สอบถามหน่อยครับไลบารี่ของ 24LCxx สามารถนำมาใช้กับ 24LCxxx ได้เลยไหมครับเช่น 24LC16 กับ 24LC512
สามารถนำมาใช้ได้เลยไหมครับ หรือมีส่วนไหนที่ต่างกันที่เราต้องแก้ครับ
บันทึกการเข้า
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8272


ShadowWares


| |
« ตอบ #20 เมื่อ: มิถุนายน 20, 2013, 01:52:36 pm »

ผมไม่รู้จักไลบารี่ 24LCxx ดังกล่าวครับ ไม่สามารถยืนยันให้ได้ ว่าได้ ไม่ได้ อย่างไร
ในกรณีทั่วไป เมื่อลงท้ายด้วย xx นั้นหมายความว่า อะไรก็ได้ แต่ไม่ได้หมายความว่าได้ในทุกกรณี
รายละเอียดที่จำเป็นน่าจะอยู่ในไฟล์ที่คุณใช้อยู่
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
Hildareth
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 2


| |
« ตอบ #21 เมื่อ: กุมภาพันธ์ 25, 2019, 05:54:27 pm »

กำลังหาโค็ดอยู่พอดี
บันทึกการเข้า
หน้า: 1 [2]   ขึ้นบน
  พิมพ์  
 
กระโดดไป: