int _I2C_SlaveTransferData(uint8_t * args) { uint8_t * arg_ptr; LPC_I2C_TypeDef* I2Cx; I2C_S_SETUP_Type* TransferCfg; I2C_TRANSFER_OPT_Type Opt; if ((arg_ptr = (uint8_t *) strtok(NULL, " ")) == NULL) return 1; I2Cx = (LPC_I2C_TypeDef*) strtoul((char *) arg_ptr, NULL, 16); if ((arg_ptr = (uint8_t *) strtok(NULL, " ")) == NULL) return 1; TransferCfg = (I2C_S_SETUP_Type*) strtoul((char *) arg_ptr, NULL, 16); if ((arg_ptr = (uint8_t *) strtok(NULL, " ")) == NULL) return 1; Opt = (I2C_TRANSFER_OPT_Type) strtoul((char *) arg_ptr, NULL, 16); sprintf((char *) str, "%x\r\n", (unsigned int) I2C_SlaveTransferData(I2Cx, TransferCfg, Opt)); writeUSBOutString(str); return 0; }
/*********************************************************************//** * @brief Main I2C master and slave program body **********************************************************************/ int c_entry(void) { PINSEL_CFG_Type PinCfg; I2C_OWNSLAVEADDR_CFG_Type OwnSlavAdr; I2C_M_SETUP_Type transferMCfg; I2C_S_SETUP_Type transferSCfg; uint32_t tempp; uint8_t *sp, *dp; // DeInit NVIC and SCBNVIC NVIC_DeInit(); NVIC_SCBDeInit(); /* Configure the NVIC Preemption Priority Bits: * two (2) bits of preemption priority, six (6) bits of sub-priority. * Since the Number of Bits used for Priority Levels is five (5), so the * actual bit number of sub-priority is three (3) */ NVIC_SetPriorityGrouping(0x05); // Set Vector table offset value #if (__RAM_MODE__==1) NVIC_SetVTOR(0x10000000); #else NVIC_SetVTOR(0x00000000); #endif /* Initialize debug */ debug_frmwrk_init(); print_menu(); /* I2C block ------------------------------------------------------------------- */ /* * Init I2C pin connect */ PinCfg.OpenDrain = 0; PinCfg.Pinmode = 0; #if ((USEDI2CDEV_M == 0) || (USEDI2CDEV_S == 0)) PinCfg.Funcnum = 1; PinCfg.Pinnum = 27; PinCfg.Portnum = 0; PINSEL_ConfigPin(&PinCfg); PinCfg.Pinnum = 28; PINSEL_ConfigPin(&PinCfg); #endif #if ((USEDI2CDEV_M == 2) || (USEDI2CDEV_S == 2)) PinCfg.Funcnum = 2; PinCfg.Pinnum = 10; PinCfg.Portnum = 0; PINSEL_ConfigPin(&PinCfg); PinCfg.Pinnum = 11; PINSEL_ConfigPin(&PinCfg); #endif // Initialize Master I2C peripheral I2C_Init(I2CDEV_M, 100000); // Initialize Slave I2C peripheral I2C_Init(I2CDEV_S, 100000); /* Set Own slave address for I2C device */ OwnSlavAdr.GeneralCallState = ENABLE; OwnSlavAdr.SlaveAddrChannel= 0; OwnSlavAdr.SlaveAddrMaskValue = 0xFF; OwnSlavAdr.SlaveAddr_7bit = I2CDEV_S_OWN_ADDR; I2C_SetOwnSlaveAddr(I2CDEV_S, &OwnSlavAdr); /* * Note: The master should be set higher priority than * the slave that let interrupt in master can appear * in slave's timeout condition. * A higher interrupt priority has lower number level!!! */ /* Configure interrupt for I2C in NVIC of ARM core */ #if ((USEDI2CDEV_M == 0) || (USEDI2CDEV_S == 0)) /* Disable I2C0 interrupt */ NVIC_DisableIRQ(I2C0_IRQn); #if (USEDI2CDEV_M == 0) /* preemption = 1, sub-priority = 0 */ NVIC_SetPriority(I2C0_IRQn, ((0x00<<3)|0x01)); #else /* preemption = 1, sub-priority = 2 */ NVIC_SetPriority(I2C0_IRQn, ((0x02<<3)|0x01)); #endif #endif /* ((USEDI2CDEV_M == 0) || (USEDI2CDEV_S == 0)) */ #if ((USEDI2CDEV_M == 2) || (USEDI2CDEV_S == 2)) /* Disable I2C2 interrupt */ NVIC_DisableIRQ(I2C2_IRQn); #if (USEDI2CDEV_M == 2) /* preemption = 1, sub-priority = 0 */ NVIC_SetPriority(I2C2_IRQn, ((0x00<<3)|0x01)); #else /* preemption = 1, sub-priority = 2 */ NVIC_SetPriority(I2C2_IRQn, ((0x02<<3)|0x01)); #endif #endif /* Enable Master I2C operation */ I2C_Cmd(I2CDEV_M, ENABLE); /* Enable Slave I2C operation */ I2C_Cmd(I2CDEV_S, ENABLE); #if 1 /* MASTER SEND DATA TO SLAVE -------------------------------------------------------- */ /* Force complete flag for the first time of running */ complete_S = RESET; complete_M = RESET; _DBG_("Master transmit data to slave..."); /* Initialize buffer */ Buffer_Init(0); /* Start I2C slave device first */ transferSCfg.tx_data = NULL; transferSCfg.tx_length = 0; transferSCfg.rx_data = Slave_Buf; transferSCfg.rx_length = sizeof(Slave_Buf); transferSCfg.callback = SlaveCallback; I2C_SlaveTransferData(I2CDEV_S, &transferSCfg, I2C_TRANSFER_INTERRUPT); /* Then start I2C master device */ transferMCfg.sl_addr7bit = I2CDEV_S_OWN_ADDR; transferMCfg.tx_data = Master_Buf; transferMCfg.tx_length = sizeof(Master_Buf); transferMCfg.rx_data = NULL; transferMCfg.rx_length = 0; transferMCfg.retransmissions_max = 3; transferMCfg.callback = MasterCallback; I2C_MasterTransferData(I2CDEV_M, &transferMCfg, I2C_TRANSFER_INTERRUPT); /* Wait until both of them complete */ while ((complete_M == RESET) || (complete_S == RESET)); // verify data sp = Master_Buf; dp = Slave_Buf; for (tempp = sizeof(Master_Buf); tempp; tempp--){ if(*sp++ != *dp++){ _DBG_("Verify data error!"); } } // Success! if (tempp == 0){ _DBG_("Verify data successfully!"); } /* MASTER RECEIVE DATA FROM SLAVE -------------------------------------------------------- */ /* Force complete flag for the first time of running */ complete_S = RESET; complete_M = RESET; _DBG_("Master read data from slave..."); /* Initialize buffer */ Buffer_Init(1); /* Start I2C slave device first */ transferSCfg.tx_data = Slave_Buf; transferSCfg.tx_length = sizeof(Slave_Buf); transferSCfg.rx_data = NULL; transferSCfg.rx_length = 0; transferSCfg.callback = SlaveCallback; I2C_SlaveTransferData(I2CDEV_S, &transferSCfg, I2C_TRANSFER_INTERRUPT); /* Then start I2C master device */ transferMCfg.sl_addr7bit = I2CDEV_S_OWN_ADDR; transferMCfg.tx_data = NULL; transferMCfg.tx_length = 0; transferMCfg.rx_data = Master_Buf; transferMCfg.rx_length = sizeof(Master_Buf); transferMCfg.retransmissions_max = 3; transferMCfg.callback = MasterCallback; I2C_MasterTransferData(I2CDEV_M, &transferMCfg, I2C_TRANSFER_INTERRUPT); /* Wait until both of them complete */ while ((complete_M == RESET) || (complete_S == RESET)); // verify data sp = Master_Buf; dp = Slave_Buf; for (tempp = sizeof(Master_Buf); tempp; tempp--){ if(*sp++ != *dp++){ _DBG_("Verify data error!"); } } // Success! if (tempp == 0){ _DBG_("Verify data successfully!"); } #endif #if 1 // TEST----------------------------------------------------------- // Master transmit two bytes, then repeat start and reading from slave // a number of byte /* Force complete flag for the first time of running */ complete_S = RESET; complete_M = RESET; _DBG_("Master transmit data to slave first, then repeat start and read data from slave..."); /* Initialize buffer */ Buffer_Init(1); master_test[0] = 0xAA; master_test[1] = 0x55; slave_test[0] = 0x00; slave_test[1] = 0x00; /* Start I2C slave device first */ transferSCfg.tx_data = Slave_Buf; transferSCfg.tx_length = sizeof(Slave_Buf); transferSCfg.rx_data = slave_test; transferSCfg.rx_length = sizeof(slave_test); transferSCfg.callback = SlaveCallback; I2C_SlaveTransferData(I2CDEV_S, &transferSCfg, I2C_TRANSFER_INTERRUPT); /* Then start I2C master device */ transferMCfg.sl_addr7bit = I2CDEV_S_OWN_ADDR; transferMCfg.tx_data = master_test; transferMCfg.tx_length = sizeof(master_test); transferMCfg.rx_data = Master_Buf; transferMCfg.rx_length = sizeof(Master_Buf); transferMCfg.retransmissions_max = 3; transferMCfg.callback = MasterCallback; I2C_MasterTransferData(I2CDEV_M, &transferMCfg, I2C_TRANSFER_INTERRUPT); /* Wait until both of them complete */ while ((complete_M == RESET) || (complete_S == RESET)); // verify data sp = Master_Buf; dp = Slave_Buf; for (tempp = sizeof(Master_Buf); tempp; tempp--){ if(*sp++ != *dp++){ _DBG_("Verify data error!"); } } // Success! if (tempp == 0){ _DBG_("Verify data successfully!"); } sp = master_test; dp = slave_test; for (tempp = sizeof(master_test); tempp; tempp--){ if(*sp++ != *dp++){ _DBG_("Verify data error!"); } } // Success! if (tempp == 0){ _DBG_("Verify data successfully!"); } #endif while (1){ tempp++; } /* Loop forever */ while(1); return 1; }
/*********************************************************************//** * @brief Main I2C master and slave program body **********************************************************************/ int c_entry(void) { PINSEL_CFG_Type PinCfg; I2C_OWNSLAVEADDR_CFG_Type OwnSlavAdr; I2C_S_SETUP_Type transferSCfg; uint32_t tempp; uint8_t *pdat; // DeInit NVIC and SCBNVIC NVIC_DeInit(); NVIC_SCBDeInit(); /* Configure the NVIC Preemption Priority Bits: * two (2) bits of preemption priority, six (6) bits of sub-priority. * Since the Number of Bits used for Priority Levels is five (5), so the * actual bit number of sub-priority is three (3) */ NVIC_SetPriorityGrouping(0x05); // Set Vector table offset value #if (__RAM_MODE__==1) NVIC_SetVTOR(0x10000000); #else NVIC_SetVTOR(0x00000000); #endif /* Initialize debug */ debug_frmwrk_init(); print_menu(); /* I2C block ------------------------------------------------------------------- */ /* * Init I2C pin connect */ PinCfg.OpenDrain = 0; PinCfg.Pinmode = 0; #if ((USEDI2CDEV_S == 0)) PinCfg.Funcnum = 1; PinCfg.Pinnum = 27; PinCfg.Portnum = 0; PINSEL_ConfigPin(&PinCfg); PinCfg.Pinnum = 28; PINSEL_ConfigPin(&PinCfg); #endif #if ((USEDI2CDEV_S == 2)) PinCfg.Funcnum = 2; PinCfg.Pinnum = 10; PinCfg.Portnum = 0; PINSEL_ConfigPin(&PinCfg); PinCfg.Pinnum = 11; PINSEL_ConfigPin(&PinCfg); #endif // Initialize Slave I2C peripheral I2C_Init(I2CDEV_S, 100000); /* Set Own slave address for I2C device */ OwnSlavAdr.GeneralCallState = ENABLE; OwnSlavAdr.SlaveAddrChannel= 0; OwnSlavAdr.SlaveAddrMaskValue = 0xFF; OwnSlavAdr.SlaveAddr_7bit = I2CDEV_S_OWN_ADDR; I2C_SetOwnSlaveAddr(I2CDEV_S, &OwnSlavAdr); /* Enable Slave I2C operation */ I2C_Cmd(I2CDEV_S, ENABLE); _DBG_("Press '1' to start"); while (_DG != '1'); /* Reading -------------------------------------------------------- */ _DBG_("Start Reading..."); /* Initialize buffer */ Buffer_Init(0); /* Start I2C slave device first */ transferSCfg.tx_data = NULL; transferSCfg.tx_length = 0; transferSCfg.rx_data = Slave_Buf; transferSCfg.rx_length = sizeof(Slave_Buf); I2C_SlaveTransferData(I2CDEV_S, &transferSCfg, I2C_TRANSFER_POLLING); pdat = Slave_Buf; // Verify for (tempp = 0; tempp < sizeof(Slave_Buf); tempp++){ if (*pdat++ != tempp){ _DBG_("Verify error"); break; } } if (tempp == sizeof(Slave_Buf)){ _DBG_("Verify successfully"); } /* Transmit -------------------------------------------------------- */ _DBG_("Start Transmit..."); /* Initialize buffer */ Buffer_Init(1); /* Start I2C slave device first */ transferSCfg.tx_data = Slave_Buf; transferSCfg.tx_length = sizeof(Slave_Buf); transferSCfg.rx_data = NULL; transferSCfg.rx_length = 0; I2C_SlaveTransferData(I2CDEV_S, &transferSCfg, I2C_TRANSFER_POLLING); _DBG_("Complete!"); #if 1 /* Receive and transmit -------------------------------------------------------- */ _DBG_("Start Receive, wait for repeat start and transmit..."); /* Initialize buffer */ Buffer_Init(1); slave_test[0] = 0xAA; slave_test[1] = 0x55; /* Start I2C slave device first */ transferSCfg.tx_data = Slave_Buf; transferSCfg.tx_length = sizeof(Slave_Buf); transferSCfg.rx_data = slave_test; transferSCfg.rx_length = sizeof(slave_test); I2C_SlaveTransferData(I2CDEV_S, &transferSCfg, I2C_TRANSFER_POLLING); _DBG_("Receive Data:"); _DBH(slave_test[0]); _DBG_(""); _DBH(slave_test[1]); _DBG_(""); _DBG_("Complete!"); #endif /* Loop forever */ while(1); return 1; }