HELP very lost..... function calls from .h

Go To Last Post
5 posts / 0 new
Author
Message
#1
  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 1

Hi all,

 

I am getting a "undefined reference to 'i2c_master_init' " i think this is to do some linking but not to sure how to correct ? 

 

UPDATE :

iv been trying to find the answer for this for a while now. and have noticed a few bit but just not sure what i am doing wrong ! sorry it must be getting hard to read now !

 

This is from i2c_master.h and give me no issues 

static inline void i2c_master_enable(const struct i2c_master_module *const module)

{

       /* Sanity check of arguments */

        Assert(module);

       Assert(module->hw);

 

       SercomI2cm *const i2c_module = &(module->hw->I2CM);

 

       /* Timeout counter used to force bus state */

        uint32_t timeout_counter = 0;

 

        /* Wait for module to sync */

        _i2c_master_wait_for_sync(module);

 

        /* Enable module */

        i2c_module->CTRLA.reg |= SERCOM_I2CM_CTRLA_ENABLE;

 

      #if I2C_MASTER_CALLBACK_MODE == true

      /* Enable module interrupts */

      system_interrupt_enable(_sercom_get_interrupt_vector(module->hw));

      #endif

      /* Start timeout if bus state is unknown */

     while (!(i2c_module->STATUS.reg & SERCOM_I2CM_STATUS_BUSSTATE(1))) {

     timeout_counter++;

     if(timeout_counter >= (module->unknown_bus_state_timeout)) {

     /* Timeout, force bus state to idle */

     i2c_module->STATUS.reg = SERCOM_I2CM_STATUS_BUSSTATE(1);

     /* Workaround #1 */

   return;

}

 

 

This is in the same file and is giving me issues

enum status_code i2c_master_init(struct i2c_master_module *const module, Sercom *const hw, const struct i2c_master_config *const config);

 

 

this is my code.....

 

 

#include <asf.h>

 

 

enum status_code i2c_master_init(struct i2c_master_module *const module,Sercom *const hw,const struct i2c_master_config *const config);

 

void initialize(void)

{

system_init();

delay_init();

ioport_init();

}

 

//I2c slave address

#define AM2315_ADDRESS 0xB8 //temp and humity sensor

 

#define DATA_LENGTH 10

#define TIMEOUT 1000 //number of time to try and send the packet before it fails

 

 

static uint8_t write_buffer[DATA_LENGTH] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09};

static uint8_t read_buffer[DATA_LENGTH];

 

 

 

struct i2c_master_module i2c_master_instance;

 

 

 

void configure_i2c_master(void)

{

/* Initialize config structure and software module. */

struct i2c_master_config config_i2c_master;

i2c_master_get_config_defaults(&config_i2c_master);

/* Change buffer timeout to something longer. */

config_i2c_master.buffer_timeout = 10000;

/* Initialize and enable device with config. */

i2c_master_init(&i2c_master_instance, SERCOM1,  &config_i2c_master);

i2c_master_enable(&i2c_master_instance);

}

 

int main (void)

{

initialize();

configure_i2c_master();

uint8_t timeout = 0 ;

struct i2c_master_packet packet ={

.address = AM2315_ADDRESS,

.data_length = DATA_LENGTH,

.data = write_buffer,

.ten_bit_address = false,

.hs_master_code = 0x0,

};

ioport_set_pin_dir(PIN_PA27, IOPORT_DIR_OUTPUT);

while(1)

{

delay_ms(1000);

ioport_set_pin_level(PIN_PA27, true);

delay_ms(1000);

ioport_set_pin_level(PIN_PA27, false);

//write buffer to slave untill success

while(i2c_master_read_packet_wait(&i2c_master_instance, &packet) != STATUS_OK){

if (timeout++ ==TIMEOUT){

break;

}

//Read from slave until success.

packet.data = read_buffer;

while (i2c_master_read_packet_wait(&i2c_master_instance, &packet) != STATUS_OK){

if (timeout++ ==TIMEOUT){

break;

}

}

}

 

}

 

this is my output...

 

------ Build started: Project: GccBoardProject1, Configuration: Debug ARM ------

Build started.

Project "GccBoardProject1.cproj" (default targets):

Target "PreBuildEvent" skipped, due to false condition; ('$(PreBuildEvent)'!='') was evaluated as (''!='').

Target "CoreBuild" in file "C:\Program Files (x86)\Atmel\Studio\7.0\Vs\Compiler.targets" from project "C:\Users\benvo\Documents\Atmel Studio\7.0\GccBoardProject1\GccBoardProject1\GccBoardProject1.cproj" (target "Build" depends on it):

Task "RunCompilerTask"

Shell Utils Path C:\Program Files (x86)\Atmel\Studio\7.0\shellUtils

C:\Program Files (x86)\Atmel\Studio\7.0\shellUtils\make.exe all --jobs 4 --output-sync 

C:\Users\benvo\Documents\Atmel Studio\7.0\GccBoardProject1\GccBoardProject1\src\main.c(35,6): warning: no previous prototype for 'initialize' [-Wmissing-prototypes]

void initialize(void)

      ^~~~~~~~~~

C:\Users\benvo\Documents\Atmel Studio\7.0\GccBoardProject1\GccBoardProject1\src\main.c(58,6): warning: no previous prototype for 'configure_i2c_master' [-Wmissing-prototypes]

void configure_i2c_master(void)

      ^~~~~~~~~~~~~~~~~~~~

Building file: ../src/main.c

Invoking: ARM/GNU C Compiler : 6.3.1

"C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\arm\arm-gnu-toolchain\bin\arm-none-eabi-gcc.exe"  -x c -mthumb -D__SAMD21G18A__ -DDEBUG -DBOARD=USER_BOARD -DARM_MATH_CM0PLUS=true -DSYSTICK_MODE -DI2C_MASTER_CALLBACK_MODE=true  -I"../src/ASF/common/boards" -I"../src/ASF/sam0/utils" -I"../src/ASF/sam0/utils/header_files" -I"../src/ASF/sam0/utils/preprocessor" -I"../src/ASF/thirdparty/CMSIS/Include" -I"../src/ASF/thirdparty/CMSIS/Lib/GCC" -I"../src/ASF/common/utils" -I"../src/ASF/sam0/utils/cmsis/samd21/include" -I"../src/ASF/sam0/utils/cmsis/samd21/source" -I"../src/ASF/sam0/drivers/system" -I"../src/ASF/sam0/drivers/system/clock/clock_samd21_r21_da_ha1" -I"../src/ASF/sam0/drivers/system/clock" -I"../src/ASF/sam0/drivers/system/interrupt" -I"../src/ASF/sam0/drivers/system/interrupt/system_interrupt_samd21" -I"../src/ASF/sam0/drivers/system/pinmux" -I"../src/ASF/sam0/drivers/system/power" -I"../src/ASF/sam0/drivers/system/power/power_sam_d_r_h" -I"../src/ASF/sam0/drivers/system/reset" -I"../src/ASF/sam0/drivers/system/reset/reset_sam_d_r_h" -I"../src/ASF/common2/boards/user_board" -I"../src" -I"../src/config" -I"../src/ASF/common2/services/delay" -I"../src/ASF/common2/services/delay/sam0" -I"../src/ASF/common/services/ioport" -I"../src/ASF/sam0/drivers/sercom" -I"../src/ASF/sam0/drivers/sercom/i2c"  -O1 -fdata-sections -ffunction-sections -mlong-calls -g3 -Wall -mcpu=cortex-m0plus -c -pipe -fno-strict-aliasing -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror-implicit-function-declaration -Wpointer-arith -std=gnu99 -ffunction-sections -fdata-sections -Wchar-subscripts -Wcomment -Wformat=2 -Wimplicit-int -Wmain -Wparentheses -Wsequence-point -Wreturn-type -Wswitch -Wtrigraphs -Wunused -Wuninitialized -Wunknown-pragmas -Wfloat-equal -Wundef -Wshadow -Wbad-function-cast -Wwrite-strings -Wsign-compare -Waggregate-return  -Wmissing-declarations -Wformat -Wmissing-format-attribute -Wno-deprecated-declarations -Wpacked -Wredundant-decls -Wnested-externs -Wlong-long -Wunreachable-code -Wcast-align --param max-inline-insns-single=500 -MD -MP -MF "src/main.d" -MT"src/main.d" -MT"src/main.o"   -o "src/main.o" "../src/main.c" 

Finished building: ../src/main.c

src/main.o: In function `configure_i2c_master':

C:\Users\benvo\Documents\Atmel Studio\7.0\GccBoardProject1\GccBoardProject1\src\main.c(69,1): error: undefined reference to `i2c_master_init'

src/main.o: In function `main':

C:\Users\benvo\Documents\Atmel Studio\7.0\GccBoardProject1\GccBoardProject1\src\main.c(103,1): error: undefined reference to `i2c_master_read_packet_wait'

collect2.exe(0,0): error: ld returned 1 exit status

make: *** [GccBoardProject1.elf] Error 1

Building target: GccBoardProject1.elf

Invoking: ARM/GNU Linker : 6.3.1

"C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\arm\arm-gnu-toolchain\bin\arm-none-eabi-gcc.exe" -o GccBoardProject1.elf  src/ASF/sam0/drivers/sercom/sercom.o src/ASF/sam0/drivers/sercom/sercom_interrupt.o src/ASF/common2/services/delay/sam0/systick_counter.o src/ASF/common2/boards/user_board/init.o src/ASF/common/utils/interrupt/interrupt_sam_nvic.o src/ASF/sam0/drivers/system/clock/clock_samd21_r21_da_ha1/clock.o src/ASF/sam0/drivers/system/clock/clock_samd21_r21_da_ha1/gclk.o src/ASF/sam0/drivers/system/interrupt/system_interrupt.o src/ASF/sam0/drivers/system/pinmux/pinmux.o src/ASF/sam0/drivers/system/system.o src/ASF/sam0/utils/cmsis/samd21/source/gcc/startup_samd21.o src/ASF/sam0/utils/cmsis/samd21/source/system_samd21.o src/ASF/sam0/utils/syscalls/gcc/syscalls.o src/main.o   -mthumb -Wl,-Map="GccBoardProject1.map" --specs=nano.specs -Wl,--start-group -larm_cortexM0l_math -lm  -Wl,--end-group -L"../src/ASF/thirdparty/CMSIS/Lib/GCC"  -Wl,--gc-sections -mcpu=cortex-m0plus -Wl,--entry=Reset_Handler -Wl,--cref -mthumb -T../src/ASF/sam0/utils/linker_scripts/samd21/gcc/samd21g18a_flash.ld  

C:\Users\benvo\Documents\Atmel Studio\7.0\GccBoardProject1\GccBoardProject1\Debug\Makefile(333,1): error: recipe for target 'GccBoardProject1.elf' failed

The command exited with code 2.

Done executing task "RunCompilerTask" -- FAILED.

Done building target "CoreBuild" in project "GccBoardProject1.cproj" -- FAILED.

Done building project "GccBoardProject1.cproj" -- FAILED.

 

Build FAILED.

========== Build: 0 succeeded or up-to-date, 1 failed, 0 skipped ==========

Last Edited: Sat. May 12, 2018 - 08:51 AM
  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

there seems to be no implementation of the missing function. The one that is found is implemented in the header, the other one is only declared. There should be a .c or .cpp file somewhere that is not included in the project and thus not compiled.

The file is probably called i2c_master.c. Make all files files visible in the Solution Explorer window by pressing the respective button on top of that window, right click the file and press "Include in project"

 

Here's an example, of course you do it for the source file, not that xml:

 

"Some people die at 25 and aren't buried until 75." -Benjamin Franklin

 

What is life's greatest illusion?"  "Innocence, my brother." -Skyrim

 

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

thank you for the response i have taken a look and can see the file are already there. i dont have include when i right click tho. is there any think else i can check ? have just noticed that i can only see the .h and not .c files that will cause a issues ?? 

Last Edited: Sat. May 12, 2018 - 11:15 AM
  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

pawi777 you were correct i was missing the .c file i had to remove part of the frame work with the ASF wizard and then bring it back and it was all good. thanks again !

  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

This post helped me understand a new project/board setup issue. However I am still having issues with creating a new Atmel Studio cryptoauthlib project for the SAMV71 board from scratch, are there any additional intructions for setting up a new cryptoauthlib project from scratch?