Tool/software:
Hi Team
I Have configure I2C3 in slave mode with receiving interrupt using AM263x LP kit. But i am not able to call my callback function. can you please check once and let me know still what i am missing.
also can you please guide me how i can configure I2C in slave mode with receiving interrupt.
Another Point I have configure two I2C in this kit for just reduce hw connection. but I am able to put and get data in both resistor I2C_ICDXR & I2C_ICDRR resistor but its not storing in the variable can you please let me know why its happing.
please collect attached main.c file and syscfg file. and some uart log also.
/* * Copyright (C) 2018-2022 Texas Instruments Incorporated * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * Neither the name of Texas Instruments Incorporated nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <stdlib.h> #include "ti_drivers_config.h" #include "ti_board_config.h" #include <drivers/soc.h> #include <drivers/i2c/v1/lld/i2c_lld.h> #include <drivers/hw_include/cslr_i2c.h> #include "ti_drivers_open_close.h" #include <kernel/dpl/HwiP.h> #include <drivers/hw_include/soc_config.h> #include <drivers/hw_include/cslr_soc.h> #include <kernel/nortos/dpl/r5/HwiP_armv7r_vim.h> #define I2C_TIMEOUT (5000U) #define I2C_INTERRUPT_PRIORITY (4U) I2CLLD_Handle I2C3,I2C1; uint8_t tx_byte = 0x0A,rx_byte=0x00,count=1; I2C_ExtendedParams I2C3_RX_Params,I2C3_TX_Params,I2C1_RX_Params,I2C1_TX_Params; I2CLLD_Handle gI2cLldHandle3; uint32_t gI2cVimStsAddr, intrNum, gI2cVimStsClrMask, intcBaseAddr; HwiP_Params hwiPrms; HwiP_Object gGpioHwiObject; HwiP_Config gHwiConfig3 = { .intcBaseAddr = 0x50F00000u, }; void gpio_led_blink_main(void *args); static void i2c_isr(void *args,const I2CLLD_Transaction * targetTxn,int32_t transferStatus); static __attribute__((__section__(".text.hwi"), noinline, naked, target("arm"), aligned(4))) void App_I2C_ISR(void); void print_dat(void) { DebugP_log("Tx_Byte = 0x%02X, Rx_Byte = 0x%02X,\n\r",tx_byte,rx_byte); // DebugP_log("BRD Send = {"); // for(int i=0; i<txlen; i++) // { // DebugP_log("0x%02X,",txdata[i]); // } // DebugP_log("} \n\r"); // DebugP_log("AM263x Rec = {"); // for(int i=0; i<rxlen; i++) // { // DebugP_log("0x%02X,",rxdata[i]); // rxdata[i] = 0; // } // DebugP_log("} \n\n\r"); } void printRegisterRange(void) { uint32_t startAddr = 0x52503004UL; uint32_t endAddr = 0x52503008UL; for (uint32_t addr = startAddr; addr <= endAddr; addr += 4) { uint32_t val = *(volatile uint32_t *)addr; DebugP_log("0x%08X : 0x%08X\r\n", addr, val); } uint32_t addr1 = 0x52501020UL; uint32_t val1 = *(volatile uint32_t *)addr1; DebugP_log("0x%08X : 0x%08X\r\n", addr1, val1); uint32_t addr3 = 0x52503018UL; uint32_t val3 = *(volatile uint32_t *)addr3; DebugP_log("0x%08X : 0x%08X\r\n", addr3, val3); } static __attribute__((__section__(".text.hwi"), noinline, naked, target("arm"), aligned(4))) void App_I2C_ISR(void) { ISR_CALL_LEVEL_NONFLOAT_REENTRANT(I2C_lld_controllerIsr, \ gI2cLldHandle3, \ intrNum, \ gI2cVimStsAddr, \ gI2cVimStsClrMask, intcBaseAddr); } static void i2c_isr(void *args,const I2CLLD_Transaction * targetTxn,int32_t transferStatus) { tx_byte = 0xAB; count++; } void init_i2c_int(void) { gI2cLldHandle3 = (I2CLLD_Handle)(gI2cLldHandle[CONFIG_I2C3]); intrNum = gI2cLldHandle3->intrNum; intcBaseAddr = gHwiConfig3.intcBaseAddr; gI2cVimStsAddr = intcBaseAddr + (0x404u + (((intrNum)>> 5) & 0xFu) * 0x20u); gI2cVimStsClrMask = 0x1u << ((intrNum) & 0x1Fu); gI2cLldHandle3->targetTransferCompleteCallback = i2c_isr; HwiP_setVecAddr(intrNum, (uintptr_t)&App_I2C_ISR); HwiP_setPri(intrNum, I2C_INTERRUPT_PRIORITY); HwiP_enableInt(intrNum); } int main(void) { System_init(); Board_init(); Drivers_open(); I2C3 = (I2CLLD_Handle)(gI2cLldHandle[CONFIG_I2C3]); I2C1 = (I2CLLD_Handle)(gI2cLldHandle[CONFIG_I2C1]); I2C1->i2cMsg.controllerMode = true; I2C1_TX_Params.deviceAddress = 0x53; I2C1_TX_Params.buffer = &tx_byte; I2C1_TX_Params.size = 1U; I2C1_TX_Params.expandSA = false; I2C3->i2cMsg.targetAddress = 0x40; I2C3_RX_Params.buffer = &rx_byte; I2C3_RX_Params.size = 1U; I2C3_RX_Params.expandSA = false; GPIO_pinWriteHigh(CSL_GPIO0_U_BASE, GPIO_LED_PIN); printRegisterRange(); print_dat(); init_i2c_int(); while(1) { printRegisterRange(); I2C_lld_write(I2C1, &I2C1_TX_Params, 100); I2C_lld_target_read(I2C3, &I2C3_RX_Params, 100); ClockP_sleep(1); DebugP_log("GPIO LED Blinking...%d\r\n",count); print_dat(); // tx_byte++; if(tx_byte > 0xF0) { tx_byte = 0x0A; } } Board_deinit(); System_deinit(); return 0; }
/** * These arguments were used when this file was generated. They will be automatically applied on subsequent loads * via the GUI or CLI. Run CLI with '--help' for additional information on how to override these arguments. * @cliArgs --device "AM263x_beta" --part "AM263x" --package "ZCZ" --context "r5fss0-0" --product "MCU_PLUS_SDK_AM263x@10.02.00" * @v2CliArgs --device "AM2634" --package "NFBGA (ZCZ)" --context "r5fss0-0" --product "MCU_PLUS_SDK_AM263x@10.02.00" * @versions {"tool":"1.23.0+4000"} */ /** * Import the modules used in this configuration. */ const gpio = scripting.addModule("/drivers/gpio/gpio", {}, false); const gpio1 = gpio.addInstance(); const i2c = scripting.addModule("/drivers/i2c/i2c"); const i2c1 = i2c.addInstance(); const i2c2 = i2c.addInstance(); const debug_log = scripting.addModule("/kernel/dpl/debug_log"); const dpl_cfg = scripting.addModule("/kernel/dpl/dpl_cfg"); const mpu_armv7 = scripting.addModule("/kernel/dpl/mpu_armv7", {}, false); const mpu_armv71 = mpu_armv7.addInstance(); const mpu_armv72 = mpu_armv7.addInstance(); const mpu_armv73 = mpu_armv7.addInstance(); const mpu_armv74 = mpu_armv7.addInstance(); const default_linker = scripting.addModule("/memory_configurator/default_linker", {}, false); const default_linker1 = default_linker.addInstance(); const general = scripting.addModule("/memory_configurator/general", {}, false); const general1 = general.addInstance(); const region = scripting.addModule("/memory_configurator/region", {}, false); const region1 = region.addInstance(); const section = scripting.addModule("/memory_configurator/section", {}, false); const section1 = section.addInstance(); const section2 = section.addInstance(); const section3 = section.addInstance(); const section4 = section.addInstance(); const section5 = section.addInstance(); const section6 = section.addInstance(); const section7 = section.addInstance(); const section8 = section.addInstance(); const section9 = section.addInstance(); const section10 = section.addInstance(); const section11 = section.addInstance(); const section12 = section.addInstance(); /** * Write custom configuration values to the imported modules. */ gpio1.$name = "GPIO_LED"; gpio1.pinDir = "OUTPUT"; gpio1.rx = true; gpio1.GPIO_n.$assign = "UART0_CTSn"; i2c1.$name = "CONFIG_I2C3"; i2c1.enableIntr = false; i2c1.sdkInfra = "LLD"; i2c1.ownTargetAddr = 0x53; i2c1.I2C.$assign = "I2C3"; i2c1.I2C_child.$name = "drivers_i2c_v1_i2c_v1_template0"; i2c2.$name = "CONFIG_I2C1"; i2c2.sdkInfra = "LLD"; i2c2.ownTargetAddr = 0x40; i2c2.I2C.$assign = "I2C1"; i2c2.I2C_child.$name = "drivers_i2c_v1_i2c_v1_template1"; debug_log.enableUartLog = true; debug_log.uartLog.$name = "CONFIG_UART0"; debug_log.uartLog.UART.$assign = "UART0"; debug_log.uartLog.UART.RXD.$assign = "UART0_RXD"; debug_log.uartLog.UART.TXD.$assign = "UART0_TXD"; debug_log.uartLog.child.$name = "drivers_uart_v2_uart_v2_template0"; mpu_armv71.$name = "CONFIG_MPU_REGION0"; mpu_armv71.size = 31; mpu_armv71.attributes = "Device"; mpu_armv71.accessPermissions = "Supervisor RD+WR, User RD"; mpu_armv71.allowExecute = false; mpu_armv72.$name = "CONFIG_MPU_REGION1"; mpu_armv72.size = 15; mpu_armv72.accessPermissions = "Supervisor RD+WR, User RD"; mpu_armv73.$name = "CONFIG_MPU_REGION2"; mpu_armv73.baseAddr = 0x80000; mpu_armv73.size = 15; mpu_armv73.accessPermissions = "Supervisor RD+WR, User RD"; mpu_armv74.$name = "CONFIG_MPU_REGION3"; mpu_armv74.accessPermissions = "Supervisor RD+WR, User RD"; mpu_armv74.baseAddr = 0x70000000; mpu_armv74.size = 21; default_linker1.$name = "memory_configurator_default_linker0"; general1.$name = "CONFIG_GENERAL0"; general1.linker.$name = "TIARMCLANG0"; region1.$name = "MEMORY_REGION_CONFIGURATION0"; region1.memory_region.create(11); region1.memory_region[0].type = "TCMA"; region1.memory_region[0].$name = "R5F_VECS"; region1.memory_region[0].size = 0x40; region1.memory_region[0].auto = false; region1.memory_region[1].type = "TCMA"; region1.memory_region[1].$name = "R5F_TCMA"; region1.memory_region[1].size = 0x7FC0; region1.memory_region[2].type = "TCMB"; region1.memory_region[2].size = 0x8000; region1.memory_region[2].$name = "R5F_TCMB"; region1.memory_region[3].$name = "SBL"; region1.memory_region[3].auto = false; region1.memory_region[3].size = 0x40000; region1.memory_region[4].$name = "OCRAM"; region1.memory_region[4].auto = false; region1.memory_region[4].manualStartAddress = 0x70040000; region1.memory_region[4].size = 0x40000; region1.memory_region[5].type = "FLASH"; region1.memory_region[5].auto = false; region1.memory_region[5].size = 0x80000; region1.memory_region[5].$name = "FLASH"; region1.memory_region[6].$name = "USER_SHM_MEM"; region1.memory_region[6].auto = false; region1.memory_region[6].manualStartAddress = 0x701D0000; region1.memory_region[6].size = 0x4000; region1.memory_region[6].isShared = true; region1.memory_region[6].shared_cores = ["r5fss0-1","r5fss1-0","r5fss1-1"]; region1.memory_region[7].$name = "LOG_SHM_MEM"; region1.memory_region[7].auto = false; region1.memory_region[7].manualStartAddress = 0x701D4000; region1.memory_region[7].size = 0x4000; region1.memory_region[7].isShared = true; region1.memory_region[7].shared_cores = ["r5fss0-1","r5fss1-0","r5fss1-1"]; region1.memory_region[8].type = "CUSTOM"; region1.memory_region[8].$name = "RTOS_NORTOS_IPC_SHM_MEM"; region1.memory_region[8].auto = false; region1.memory_region[8].manualStartAddress = 0x72000000; region1.memory_region[8].size = 0x3E80; region1.memory_region[8].isShared = true; region1.memory_region[8].shared_cores = ["r5fss0-1","r5fss1-0","r5fss1-1"]; region1.memory_region[9].type = "CUSTOM"; region1.memory_region[9].$name = "MAILBOX_HSM"; region1.memory_region[9].auto = false; region1.memory_region[9].manualStartAddress = 0x44000000; region1.memory_region[9].size = 0x3CE; region1.memory_region[9].isShared = true; region1.memory_region[9].shared_cores = ["r5fss0-1","r5fss1-0","r5fss1-1"]; region1.memory_region[10].type = "CUSTOM"; region1.memory_region[10].$name = "MAILBOX_R5F"; region1.memory_region[10].auto = false; region1.memory_region[10].manualStartAddress = 0x44000400; region1.memory_region[10].size = 0x3CE; region1.memory_region[10].isShared = true; region1.memory_region[10].shared_cores = ["r5fss0-1","r5fss1-0","r5fss1-1"]; section1.load_memory = "R5F_VECS"; section1.group = false; section1.$name = "Vector Table"; section1.output_section.create(1); section1.output_section[0].$name = ".vectors"; section1.output_section[0].palignment = true; section2.load_memory = "OCRAM"; section2.$name = "Text Segments"; section2.output_section.create(5); section2.output_section[0].$name = ".text.hwi"; section2.output_section[0].palignment = true; section2.output_section[1].$name = ".text.cache"; section2.output_section[1].palignment = true; section2.output_section[2].$name = ".text.mpu"; section2.output_section[2].palignment = true; section2.output_section[3].$name = ".text.boot"; section2.output_section[3].palignment = true; section2.output_section[4].$name = ".text:abort"; section2.output_section[4].palignment = true; section3.load_memory = "OCRAM"; section3.$name = "Code and Read-Only Data"; section3.output_section.create(2); section3.output_section[0].$name = ".text"; section3.output_section[0].palignment = true; section3.output_section[1].$name = ".rodata"; section3.output_section[1].palignment = true; section4.load_memory = "OCRAM"; section4.$name = "Data Segment"; section4.output_section.create(1); section4.output_section[0].$name = ".data"; section4.output_section[0].palignment = true; section5.load_memory = "OCRAM"; section5.$name = "Memory Segments"; section5.output_section.create(3); section5.output_section[0].$name = ".bss"; section5.output_section[0].output_sections_start = "__BSS_START"; section5.output_section[0].output_sections_end = "__BSS_END"; section5.output_section[0].palignment = true; section5.output_section[1].$name = ".sysmem"; section5.output_section[1].palignment = true; section5.output_section[2].$name = ".stack"; section5.output_section[2].palignment = true; section6.load_memory = "OCRAM"; section6.$name = "Stack Segments"; section6.output_section.create(5); section6.output_section[0].$name = ".irqstack"; section6.output_section[0].output_sections_start = "__IRQ_STACK_START"; section6.output_section[0].output_sections_end = "__IRQ_STACK_END"; section6.output_section[0].input_section.create(1); section6.output_section[0].input_section[0].$name = ". = . + __IRQ_STACK_SIZE;"; section6.output_section[1].$name = ".fiqstack"; section6.output_section[1].output_sections_start = "__FIQ_STACK_START"; section6.output_section[1].output_sections_end = "__FIQ_STACK_END"; section6.output_section[1].input_section.create(1); section6.output_section[1].input_section[0].$name = ". = . + __FIQ_STACK_SIZE;"; section6.output_section[2].$name = ".svcstack"; section6.output_section[2].output_sections_start = "__SVC_STACK_START"; section6.output_section[2].output_sections_end = "__SVC_STACK_END"; section6.output_section[2].input_section.create(1); section6.output_section[2].input_section[0].$name = ". = . + __SVC_STACK_SIZE;"; section6.output_section[3].$name = ".abortstack"; section6.output_section[3].output_sections_start = "__ABORT_STACK_START"; section6.output_section[3].output_sections_end = "__ABORT_STACK_END"; section6.output_section[3].input_section.create(1); section6.output_section[3].input_section[0].$name = ". = . + __ABORT_STACK_SIZE;"; section6.output_section[4].$name = ".undefinedstack"; section6.output_section[4].output_sections_start = "__UNDEFINED_STACK_START"; section6.output_section[4].output_sections_end = "__UNDEFINED_STACK_END"; section6.output_section[4].input_section.create(1); section6.output_section[4].input_section[0].$name = ". = . + __UNDEFINED_STACK_SIZE;"; section7.load_memory = "OCRAM"; section7.$name = "Initialization and Exception Handling"; section7.output_section.create(3); section7.output_section[0].$name = ".ARM.exidx"; section7.output_section[0].palignment = true; section7.output_section[1].$name = ".init_array"; section7.output_section[1].palignment = true; section7.output_section[2].$name = ".fini_array"; section7.output_section[2].palignment = true; section8.load_memory = "USER_SHM_MEM"; section8.type = "NOLOAD"; section8.$name = "User Shared Memory"; section8.group = false; section8.output_section.create(1); section8.output_section[0].$name = ".bss.user_shared_mem"; section8.output_section[0].alignment = 0; section9.load_memory = "LOG_SHM_MEM"; section9.$name = "Log Shared Memory"; section9.group = false; section9.type = "NOLOAD"; section9.output_section.create(1); section9.output_section[0].$name = ".bss.log_shared_mem"; section9.output_section[0].alignment = 0; section10.load_memory = "RTOS_NORTOS_IPC_SHM_MEM"; section10.type = "NOLOAD"; section10.$name = "IPC Shared Memory"; section10.group = false; section10.output_section.create(1); section10.output_section[0].$name = ".bss.ipc_vring_mem"; section10.output_section[0].alignment = 0; section11.load_memory = "MAILBOX_HSM"; section11.type = "NOLOAD"; section11.$name = "SIPC HSM Queue Memory"; section11.group = false; section11.output_section.create(1); section11.output_section[0].$name = ".bss.sipc_hsm_queue_mem"; section11.output_section[0].alignment = 0; section12.load_memory = "MAILBOX_R5F"; section12.$name = "SIPC R5F Queue Memory"; section12.group = false; section12.type = "NOLOAD"; section12.output_section.create(1); section12.output_section[0].$name = ".bss.sipc_secure_host_queue_mem"; section12.output_section[0].alignment = 0; /** * Pinmux solution for unlocked pins/peripherals. This ensures that minor changes to the automatic solver in a future * version of the tool will not impact the pinmux you originally saw. These lines can be completely deleted in order to * re-solve from scratch. */ i2c1.I2C.SCL.$suggestSolution = "EPWM8_B"; i2c1.I2C.SDA.$suggestSolution = "EPWM8_A"; i2c2.I2C.SCL.$suggestSolution = "I2C1_SCL"; i2c2.I2C.SDA.$suggestSolution = "I2C1_SDA";
Tx_Byte = 0x0A, Rx_Byte = 0x00, 0x52503004 : 0x00000040 0x52503008 : 0x00000438 0x52501020 : 0x0000000A 0x52503018 : 0x0000000A GPIO LED Blinking...1 Tx_Byte = 0x0A, Rx_Byte = 0x00, 0x52503004 : 0x00000040 0x52503008 : 0x00000438 0x52501020 : 0x0000000A 0x52503018 : 0x0000000A GPIO LED Blinking...1 Tx_Byte = 0x0A, Rx_Byte = 0x00, 0x52503004 : 0x00000040 0x52503008 : 0x00000438 0x52501020 : 0x0000000A 0x52503018 : 0x0000000A GPIO LED Blinking...1 Tx_Byte = 0x0A, Rx_Byte = 0x00, 0x52503004 : 0x00000040 0x52503008 : 0x00000438 0x52501020 : 0x0000000A 0x52503018 : 0x0000000A