STM32F103C8 กับ EEPROM_24LC01B_MCP ทาง I2C Gen_Code ด้วย CubeMX นิ่งเลย T_T!

  • 24 Replies
  • 3179 Views
*

Offline dec

  • **
  • 56
    • View Profile
ดูจากกราฟแล้ว ตัว EEPROM มันไม่ ack ตอบนะครับ กรณีปกติตอนส่ง address master จะส่ง bit ที่ 9 เป็น high ตามไปด้วย หลังจากส่ง address 7bit + RW 1 bit ไปแล้ว ถ้า slave ได้รับมันจะพยายามดึง bit ที่ 9 เป็น low ไว้ เป็นการ ack ตอบ master ครับ พอ slave ไม่ ack มันก็เลยจบการสื่อสารเลย

*

Offline TaoTao

  • ***
  • 208
    • View Profile
ดูจากกราฟแล้ว ตัว EEPROM มันไม่ ack ตอบนะครับ กรณีปกติตอนส่ง address master จะส่ง bit ที่ 9 เป็น high ตามไปด้วย หลังจากส่ง address 7bit + RW 1 bit ไปแล้ว ถ้า slave ได้รับมันจะพยายามดึง bit ที่ 9 เป็น low ไว้ เป็นการ ack ตอบ master ครับ พอ slave ไม่ ack มันก็เลยจบการสื่อสารเลย

อ่อ อย่างนี้นี่เอง  :-[

อันนี้ วิเคราะด้วย เครื่องมือใหม่ Saleae
(แต่เก่าเก็บ ซื้อไว้เป็นชาติ  ;D)

ข้อมูลสุดท้าย ผมสั่ง Read = 0xA1
Complier ตีความเป็น 0xA0
(เครื่องมือวัดมันบอก)

คงกลายเป็น คำสั่ง Write ไป รึเปล่า

ทีนี้ จะทำไงให้มันสั่ง 0xA1 ได้อ่ะครับ
เพิ่อจะสั่ง Read ข้อมูล จาก EEPROM

แต่ Saleae ตัวนี้ อ่านง่ายกว่า สโคปเยอะ
ไม่ต้องนั่งนับ เต้า
ตอนนอน เห็นเต้าเต็มไปหมด
 ;D

*

Offline TaoTao

  • ***
  • 208
    • View Profile
โค้ด บรรทัด 2 คำสั่ง Read 0xA1 from EEPROM
ยังผิดอยู่แน่เลย :
HAL_I2C_Mem_Read(     &hi2c1,   (uint16_t)0x00A1, (uint16_t)0,    (uint16_t)1,    &my_get,    1,       3000);

มันเลยกลายเป็น สั่ง Write ด้วย 0xA0 แล้ว NAK เลย
จะแก้ให้ Bit 0 กลายเป็น 1 ได้ยังไงอ่ะครับ
 :-[

*

Offline dec

  • **
  • 56
    • View Profile
โค้ด บรรทัด 2 คำสั่ง Read 0xA1 from EEPROM
ยังผิดอยู่แน่เลย :
HAL_I2C_Mem_Read(     &hi2c1,   (uint16_t)0x00A1, (uint16_t)0,    (uint16_t)1,    &my_get,    1,       3000);

มันเลยกลายเป็น สั่ง Write ด้วย 0xA0 แล้ว NAK เลย
จะแก้ให้ Bit 0 กลายเป็น 1 ได้ยังไงอ่ะครับ
 :-[

อันนี้ปกติครับ sequence ในการอ่านข้อมูลจาก EEPROM ขั้นแรก Master จะขอ Write ข้อมูลก่อน เพื่อทำการส่ง Memory Address ที่จะต้องการจะอ่านข้อมูลครับ เสร็จแล้ว Master จึงจะส่งขอ Read ครับ

*

Offline TaoTao

  • ***
  • 208
    • View Profile
ปัญหานี้ เคลียร์แล้วครับ

I2C Lib โดยเฉพาะ Memory ของ HAL ที่เจ้า CubeMX มัน Gen ให้
บางฟังชั่น ผมใช้แล้วไม่เวิร์คครับ
เข้าเว็บ st มา ฝรั่ง ก็เจอเป็นเช่นกัน

ที่ใช้ได้ คือ TRANSMIT
ส่วน Read ทดลองแล้ว ใช้ไม่ได้ครับ
เอา สโคปจับ กราฟมั่วไปหมด
(สั่ง Read 0xA1 แปลงเป็น 0xA0 เฉย
ซึ่ง อัลกอลิทึม มันไม่ตรงกับฝ่าย EEPROM ที่ต้องการ
เลยกลายเป็น NACK อยู่บ่อยๆ)

ต้องแก้โดย เอา I2C Timing-Read-Write ของ RM0008 และ Datasheet ของ STM มาวิเคราะห์
และปรับให้เข้ากับ DataSheet EEPROM โดยเฉพาะครับ จึงจะอ่านค่าได้

ผมเลยเขียน Functions ง่ายๆ มาใช้งานเอง
เฉพาะส่วน EEPROM I2C ทั้ง Write/Read ครับ
แล้วเอา Saleae จับ สามารถ บันทึก-อ่าน EEPROM ได้ตามที่ต้องการแว้ว
เดี๋ยว เล่นโหมด DMA ต่อ  ;D

ส่วน R pullup ที่ผมทดลอง เสถียรสุด คือ 2k - 5k ครับ

ขอบคุณทุกๆ คนมาก ครับ
 :D

ขอปรบมือให้กับความมุ่งมั่นพยายามในการแก้ปัญหาครับ  เข้าถึง root cause เลย

*

Offline TaoTao

  • ***
  • 208
    • View Profile
ขอปรบมือให้กับความมุ่งมั่นพยายามในการแก้ปัญหาครับ  เข้าถึง root cause เลย
ขอบคุณนะครับ

พูดถึง Hal Lib : EEPROM I2C  เล่นผมเป็น หมีแพนด้า
หลายวันเลย  ;D

แต่ ผลพลอยได้ คือ เลยได้เปรียบเทียบ EEPROM
หลายเบอร์ หลายยี่ห้อ ในหลายๆ มิติ

ได้ข้อสรุปเลย (สำหรับผมนะครับ)
เท่าที่หาซื้อได้ในไทย Atmel เจ๋งเป้งฝุดๆ
performance ดีกว่าเจ้าอื่น มากกว่าเท่าตัวเลย
และใช้ไฟต่ำ + high speed ด้วย

ไม่รู้ว่าได้ลองกับ eeprom ของ  nxp (philips เดิม  ต้นตำรับของ I2C bus)  ไหมครับ  เป็นอย่างไรบ้าง

ที่คุณกล่าวถึง performance  อยากทราบหน่อยครับ ว่าคุณพิจารณาในแง่ใดบ้าง  (ถ้าเป็นข้อปกปิดของขอบเขตงานคุณ ก็ไม่เป็นไรครับ)