Transcription of ET2016:ハードウェアトラック] I2C通信 ... - TOPPERS
1 2016/11/18ET2016 1 ET2016: I2C FPGA ALTREA(Intel)EK-10M50F484 2016/11/18ET2016 2 niosII uast gpio asp 1. I/F1. I/F2. ( )3. 4. 5. 6. 2016/11/18ET2016 3 LCD EEPROM MPU SoC UART( ) I2C(Inter-Integrated Circuit) SPI(Serial Peripheral Interface) 2016/11/18ET2016 ( )1. I/F2. ( )3. 4. 5. 6. 2016/11/18ET2016 5I2C I2C 1980 ( NXP ) 2014 2001 SoC 2016/11/18ET2016 6I2C (SDA) (SCL) 2016/11/18ET2016 7I2C 100kbit/s 400kbit/s (Hs)
2 400pF IC 82016/11/18ET2016 I2C 92016/11/18 ET2016 I2C 102016/11/18 A B A B A B A A B A B B A A ET2016 I2C 112016/11/18 START STOP H SDA H L SCL L I2C START STOP SCL H SDL H L START SCL H SDL L H STOP START STOP ET2016 I2C 122016/11/18 SDA 8 (MSB) SDA ( H ) H SDL L SDA ET2016 I2C 132016/11/18 MasterSCLSDASCLSDAS lave 1 SCLSDAS lave 2 Vdd I2C(Inter-Integrated Circuit) (SCL) (SDA)
3 2 SCL SDA 100kbps or 400kbps ET2016 I2C 142016/11/18 7bit SCL High SDA Low Start SCL High SDA High Stop SCL Low BUSY SCL Low 1-7891-789D7-D1D0D7-D1D0 SCLSDAMSB( )LSB( )Start ConditionSlave AddressWrite 0 ACKW rite DataACKStop Condition ET2016 I2C 3 152016/11/18 7bit ACK 1-7891-789D7-D1D0D7-D1D0 SCLSDAMSBLSBS tart ConditionSlave AddressRead 1 ACKRead DataACKStop Condition ET2016 SCL Low SCL Low SCL Hi ET2016 162016/11/18 SCL Low Low Low 3.
4 1. I/F2. ( )3. 4. 5. 6. 2016/11/18ET2016 17 PCB PCB I2C PCB 2016/11/18ET2016 18 STM32F401 nucleo641500 Arduino Uno Rev32940 Prototyping Shield1100 I2C DEVICEA rduino I2C (Prototyping) Shield Prototyping Shield I2C LCD EEPROM I2C LCD EEPROM read Prototyping Shield D14,D15 I2C 401nucleo-64,446 nucleo-64 D14,15 Arduino 2016/11/18ET2016 19 STM32F401 nucleo-64 STM32F446 nucleo-64 Nucleo I2C (Prototyping) Shield STM32F401 Nucleo I2C (Prototyping) Shield USB ST-LINKV2 2016/11/18ET2016 204.
5 1. I/F2. ( )3. 4. 5. 6. 2016/11/18ET2016 21 TOPPERS BASE for STM32F4xx Windows Bash Cygwin MinGW ARM GNU-ARM RTOS TOPPERS /ASP STM32F401 Nucleo 2016/11/18ET2016 22 TOPPERS BASE 2016/11/18ET2016 23 BASE PLATFROM driverBase drivergpiogpio dmadma(timer)(timer)uartuartStandard driveri2ci2cCLCD/senser ReferenceManualspispiGLCD/SDcardadcadcJo y stickusbOTGusbOTGMSC/HIDM7F depend driverltdcGLCDA pplication ManualReference ManualtprtcClocksdmmcSDcardaudioapimiddl ewareFile SystemfatfsfatfsFAT filelibraryfile libraryC language filestdiostdioSTDIO(Open source)librarySTM-BSPGUI libjpegJPEG libmadMP3 2016 12 2016/11/18ET2016 24 TFT SD-Card PlayerTOPPERS Bash 2016/11/18ET2016 25 ROM syslog printf UNIX 2016/11/18ET2016 26 b-shell(bash)
6 Makefile TureSTDIO 2016/11/18ET2016 27 TOPPERS BASE STM Arduino USB USB-OTG MSC HID STM32F746 Discovery LCD SDMMC USB-OTG 2016/11/18ET2016 28 LCD I2C BLE EPC USB-OTGSTM32F401 REnucleo STM32F4 Discovery ---- STM32F746 Discovery-- STM32F446RE nucleo-64 STM32F446 ZEnucleo-144 STM32F746ZG nucleo-144 D15,14 5. 1. I/F2. ( )3. 4. 5. 6. 2016/11/18ET2016 29 API RTOS 2016/11/18ET2016 30I2C API ID I/F 2016/11/18ET2016 31 i2c_initI2C_Handler*ID portidI2C_Init_t* hi2c ID I2C i2c_deinitERI2C_Handler* hi2cI2C i2c_slavewriteERI2C_Handler* hi2cuint8_t* pDatauint16_t Size i2c_slavereadERI2C_Handler* hi2cuint8_t* pDatauint16_t Size I2C API MemAddSize 2016/11/18ET2016 32 i2c_memwriteERI2C_Handler* hi2cuint16_t DevAddruint16_t
7 MemAddruint16_t MemAddSizeuint8_t* pDatauint16_t Size MemAddSize i2c_memreadERI2C_Handler* hi2cuint16_t DevAddruint16_t MemAddruint16_t MemAddSizeuint8_t* pDatauint16_t Size MemAddSize I2C ITRON ER E_PAR E_OBJ ET2016 332016/11/18 ERi2c_memwrite(I2C_Handle_t *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size){ER ercd= E_OK;if(pData== NULL || Size == 0)return E_PAR;if(hi2c-> != I2C_ADDRESSINGMODE_7 BIT && MemAddSize!= 0)return E_PAR;if(hi2c->status != I2C_STATUS_READY)return E_OBJ;if(i2c_busreadywait(hi2c, I2C_TIMEOUT_BUSY_FLAG) != E_OK)return E_OBJ;/** */if(hi2c-> != 0)wai_sem(hi2c-> ); I2C ET2016 342016/11/18/** Acknowledge/PEC Position */sil_andw_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR1), I2C_CR1_POS);hi2c->status = I2C_STATUS_BUSY_TX;hi2c->ErrorCode= I2C_ERROR_NONE;hi2c->pBuffPtr= pData;hi2c->XferSize= Size;hi2c->XferCount= Size;/* */if((ercd= i2c_masterwriteaddress(hi2c, DevAddress, MemAddress, MemAddSize, I2C_TIMEOUT_FLAG)) !)}
8 = E_OK){if(hi2c-> != 0)sig_sem(hi2c-> );return ercd;}/** */sil_orw_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR2), (I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN | I2C_CR2_ITERREN));ercd= i2c_transwait(hi2c, 500);/** */if(hi2c-> != 0)sig_sem(hi2c-> );return ercd;} I2C i2c_mesaterwriteaddress ET2016 352016/11/18static ERi2c_masterwriteaddress(I2C_Handle_t *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint32_t Timeout){ER ercd= E_OK;/** */sil_orw_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR1), I2C_CR1_START);if(i2c_sr1flagsetwait(hi2 c, I2C_SR1_SB, Timeout) != E_OK){return E_TMOUT;}/** */if(hi2c-> I2C_ADDRESSINGMODE_7 BIT){sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_DR), I2C_7 BIT_ADD_WRITE(DevAddress));} I2C ET2016 362016/11/18else{sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_DR), I2C_10 BIT_HEADWRITE(DevAddress));if((ercd= i2c_addrflagwait(hi2c, I2C_SR1_ADD10, Timeout)) !}
9 = E_OK){return ercd;}/** 10 */sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_DR), I2C_10 BIT_ADDRESS(DevAddress));}/** */if((ercd= i2c_addrflagwait(hi2c, I2C_SR1_ADDR, Timeout)) != E_OK){return ercd;}/** */i2c_clear_addr(hi2c);/** */if(MemAddSize== 0)return E_OK; I2C ET2016 372016/11/18/** TXE */if(i2c_sr1flagsetwait(hi2c, I2C_SR1_TXE, Timeout) != E_OK){return E_TMOUT;}/** */if(MemAddSize== I2C_MEMADD_SIZE_8 BIT){sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_DR), I2C_MEM_ADD_LSB(MemAddress));}else{/* 16 */sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_DR), I2C_MEM_ADD_MSB(MemAddress));if(i2c_sr1f lagsetwait(hi2c, I2C_SR1_TXE, Timeout) != E_OK){return E_TMOUT;}sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_DR), I2C_MEM_ADD_LSB(MemAddress));}return E_OK;} I2C: TXE ET2016 382016/11/18voidi2c_ev_handler(I2C_Handl e_t *hi2c){uint32_t sr1 = sil_rew_mem((uint32_t *)(hi2c->base+TOFF_I2C_SR1));uint32_t sr2 = sil_rew_mem((uint32_t *)(hi2c->base+TOFF_I2C_SR2));uint32_t cr2 = sil_rew_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR2));volatile uint32_t tmp;/** */if((sr2 & I2C_SR2_MSL) !
10 = 0){if((sr2 & I2C_SR2_TRA) != 0){/* */if(((sr1 & I2C_SR1_TXE) != 0) && ((cr2 & I2C_CR2_ITBUFEN) != 0) && ((sr1 & I2C_SR1_BTF) == 0)){i2C_MasterTransmit_TXE(hi2c);}else if(((sr1 & I2C_SR1_BTF) != 0) && ((cr2 & I2C_CR2_ITEVTEN) != 0)){i2c_mastertrans_BTF(hi2c);}}else{/* */ I2C: ET2016 392016/11/18static voidi2C_MasterTransmit_TXE(I2C_Handle_t *hi2c){/* */sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_DR), (uint32_t)(*hi2c->pBuffPtr++));hi2c->Xfe rCount--;if(hi2c->XferCount== 0){/* */sil_andw_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR2), I2C_CR2_ITBUFEN);}}static voidi2c_mastertrans_BTF(I2C_Handle_t *hi2c){if(hi2c->XferCount!= 0){/* */sil_wrw_mem((uint32_t *)(hi2c->base+TOFF_I2C_DR), (uint32_t)(*hi2c->pBuffPtr++));hi2c->Xfe rCount--;}else{/* */sil_andw_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR2), (I2C_CR2_ITEVTEN | I2C_CR2_ITBUFEN | I2C_CR2_ITERREN));sil_orw_mem((uint32_t *)(hi2c->base+TOFF_I2C_CR1), I2C_CR1_STOP);hi2c->status = I2C_STATUS_READY;if(hi2c->writecallback! }}}}