エンベデッド・ペリフェラルIPユーザーガイド

ID 683130
日付 9/21/2020
Public
ドキュメント目次
1. 概要 2. Avalon® -ST Multi-Channel Shared Memory FIFOコア 3. Avalon® -STシングルクロックFIFOコアおよびデュアルクロックFIFOコア 4. Avalon® -STシリアル・ペリフェラル・インターフェイス・コア 5. SPIコア 6. SPI Slave to Avalon® Master Bridgeコア/JTAG to Avalon® Master Bridgeコア 7. インテル eSPIスレーブコア 8. eSPI to LPCブリッジコア 9. イーサネットMDIOコア 10. インテルFPGA 16550互換UARTコア 11. UARTコア 12. JTAG UARTコア 13. インテル FPGA Avalon® Mailboxコア 14. インテル FPGA Avalon® ミューテックス・コア 15. インテル FPGA Avalon® I2C (Master) コア 16. インテル FPGA I2C Slave to Avalon® -MM Master Bridgeコア 17. インテルFPGA Avalon® コンパクト・フラッシュ・コア 18. EPCS/EPCQAシリアル・フラッシュ・コントローラー・コア 19. インテルFPGAシリアル・フラッシュ・コントローラー・コア 20. インテルFPGAシリアル・フラッシュ・コントローラーIIコア 21. インテルFPGA汎用クアッドSPIコントローラー・コア 22. インテルFPGA汎用クアッドSPIコントローラーIIコア 23. インターバル・タイマー・コア 24. インテルFPGA Avalon FIFOメモリーコア 25. オンチップメモリー (RAMおよびROM) コア 26. Optrex 16207 LCDコントローラー・コア 27. PIOコア 28. PLLコア 29. DMAコントローラー・コア 30. Modular Scatter-Gather DMAコア 31. Scatter-Gather DMAコントローラー・コア 32. SDRAMコントローラー・コア 33. トライステートSDRAMコア 34. Video Sync GeneratorコアとPixel Converterコア 35. インテル FPGA Interrupt Latency Counterコア 36. パフォーマンス・カウンター・ユニット・コア 37. ベクトル割り込みコントローラー・コア 38. Avalon® -STデータ・パターン・ジェネレーター・コアとデータ・パターン・チェッカー・コア 39. Avalon® -STテスト・パターン・ジェネレーター・コアとテスト・パターン・チェッカー・コア 40. システムIDペリフェラル・コア 41. Avalon® Packets to Transactions Converterコア 42. Avalon® -STマルチプレクサー・コアとデマルチプレクサー・コア 43. Avalon® -ST Bytes to Packets ConverterコアとPackets to Bytes Converterコア 44. Avalon® -ST Delayコア 45. Avalon® -STラウンド・ロビン・スケジューラー・コア 46. Avalon® -ST Splitterコア 47. Avalon® -MM DDR Memory Half Rate Bridgeコア 48. インテル FPGA GMII to RGMIIコンバーター・コア 49. インテル FPGA MII to RMIIコンバーター・コア 50. インテルFPGA HPS GMII to TSE 1000BASE-X/SGMII PCSブリッジコア 51. インテル FPGA HPS EMAC to Multi-rate PHY GMIIアダプターコア 52. インテル FPGA MSI to GICジェネレーター・コア

15.7.6. プログラミング・モデル

次のフローチャートは、推奨されるコアのプログラミング・フローを示しています。

図 54. プログラミング・モデルのフローチャート
注: ARBLOST_DETまたはNACK_DETのいずれかが発生している場合は、エラー処理手順でそれぞれの割り込みステータス・レジスター・ビットをクリアしてから、新しいI2C転送を続行する必要があります。新しいI2C転送は、コアを無効にするかしないかに関係なく開始することができます。

APIの使用方法

int main() 
{
  ALT_AVALON_I2C_DEV_t *i2c_dev;  //pointer to instance structure
  alt_u8 txbuffer[0x200];
  alt_u8 rxbuffer[0x200];  
  int i;
  ALT_AVALON_I2C_STATUS_CODE status;
  
  //get a pointer to the avalon i2c instance
  i2c_dev = alt_avalon_i2c_open("/dev/i2c_0");
  if (NULL==i2c_dev)
  {
      printf("Error: Cannot find /dev/i2c_0\n");
      return 1;
  }
  
  //set the address of the device using 
  
  alt_avalon_i2c_master_target_set(i2c_dev,0x51)	

  //write data to an eeprom at address 0x0200
  
  txbuffer[0]=2; txbuffer[1]=0;  
  
  //The eeprom address which will be sent as first two bytes of data
  
  for (i=0;i<0x10;i++) txbuffer[i+2]=i;   //some data to write
  status=alt_avalon_i2c_master_tx(i2c_dev,txbuffer, 0x10+2, ALT_AVALON_I2C_NO_INTERRUPTS);
  if (status!=ALT_AVALON_I2C_SUCCESS) return 1; //FAIL

  //read back the data into rxbuffer
  //This command sends the 2 byte eeprom data address required by the eeprom
  //Then does a restart and receives the data.
  status=alt_avalon_i2c_master_tx_rx(i2c_dev, txbuffer, 2, rxbuffer, 0x10, ALT_AVALON_I2C_NO_INTERRUPTS);
  if (status!=ALT_AVALON_I2C_SUCCESS) return 1; //FAIL
  return 0;
}

//Using the optional irq callback:

int main() 
{
  ALT_AVALON_I2C_DEV_t *i2c_dev;  //pointer to instance structure
  alt_u8 txbuffer[0x210];
  alt_u8 rxbuffer[0x200];  
  int i;
  ALT_AVALON_I2C_STATUS_CODE status;

  //storage for the optional provided interrupt handler structure 
  IRQ_DATA_t irq_data;
  
  //get a pointer to the avalon i2c instance
  i2c_dev = alt_avalon_i2c_open("/dev/i2c_0");
  if (NULL==i2c_dev)
  {
      printf("Error: Cannot find /dev/i2c_0\n");
      return 1;
  }
  
  //register the optional interrupt callback.  
  alt_avalon_i2c_register_optional_irq_handler(i2c_dev,&irq_data);

  //set the address of the device we will be using
  alt_avalon_i2c_master_target_set(i2c_dev,0x51);	 

  //assume an eeprom at address 0x51

  //write data to an eeprom at address (within the eeprom) 0x0200
  txbuffer[0]=2; 
  txbuffer[1]=0;  
  
  //The eeprom data address which will be sent as first two bytes of data

  for (i=0;i<0x10;i++) txbuffer[i+2]=i;   //some data to write

  while (1) {  //for function retry
     status=alt_avalon_i2c_master_tx(i2c_dev, txbuffer, 0x10+2, ALT_AVALON_I2C_USE_INTERRUPTS);
     
     
     if (status!=ALT_AVALON_I2C_SUCCESS) return 1; //FAIL

     //Completion should be checked by using the alt_avalon_i2c_interrupt_transaction_status function.
     //Note: Interrupt and non-interrupt transactions can be mixed in any sequence, so if desired this short address setup transaction can use ALT_AVALON_I2C_NO_INTERRUPTS.
     
     
     while (alt_avalon_i2c_interrupt_transaction_status(i2c_dev) == ALT_AVALON_I2C_BUSY) {  }
    
     //Did the transaction complete OK? If yes then break out of this retry loop, otherwise, have to do the transaction again
     //You may want to have a retry limit instead of 
     
     while (1)
     if (alt_avalon_i2c_interrupt_transaction_status(i2c_dev) == ALT_AVALON_I2C_SUCCESS) break;
  }
  while (1) { 
      
     //for function retry, read back the data into rxbuffer
     
     
     status=alt_avalon_i2c_master_tx_rx(i2c_dev, txbuffer, 2, rxbuffer, 0x10, ALT_AVALON_I2C_USE_INTERRUPTS);
     
     
     if (status!=ALT_AVALON_I2C_SUCCESS) return 1; //FAIL
  
     //For this example we will just waste the time in a loop.
     
     
     while (alt_avalon_i2c_interrupt_transaction_status(i2c_dev) == ALT_AVALON_I2C_BUSY) {  }
    
     //Did the transaction complete OK
     
     if (alt_avalon_i2c_interrupt_transaction_status(i2c_dev) == ALT_AVALON_I2C_SUCCESS) break;
  }
  
  return 0;
}