Make the two keyboard halves communicate with each other via I2C.

This commit is contained in:
László Monda
2016-03-11 15:39:08 +01:00
parent 7b30750ef5
commit 51de538b4a
16 changed files with 180 additions and 24 deletions

View File

@@ -19,7 +19,8 @@ SET(CMAKE_EXECUTABLE_LIBRARY_SUFFIX)
# CURRENT DIRECTORY
SET(SrcDir "${CMAKE_CURRENT_SOURCE_DIR}/../..")
SET(KsdkDir "${SrcDir}/../lib/KSDK_1.3_FRDM-KL03Z/")
SET(KsdkDir "${SrcDir}/../lib/KSDK_1.3_FRDM-KL03Z")
SET(IncludeDir "${SrcDir}/../include")
# DEBUG LINK FILE
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -T${KsdkDir}/platform/devices/MKL03Z4/linker/gcc/MKL03Z32xxx4_flash.ld -static")
@@ -75,6 +76,7 @@ IF(CMAKE_BUILD_TYPE MATCHES Debug)
INCLUDE_DIRECTORIES(${KsdkDir}/examples)
INCLUDE_DIRECTORIES(${KsdkDir}/examples/frdmkl03z)
INCLUDE_DIRECTORIES(${KsdkDir})
INCLUDE_DIRECTORIES(${IncludeDir})
ELSEIF(CMAKE_BUILD_TYPE MATCHES Release)
INCLUDE_DIRECTORIES(${KsdkDir}/platform/osa/inc)
INCLUDE_DIRECTORIES(${KsdkDir}/platform/utilities/inc)
@@ -89,6 +91,7 @@ ELSEIF(CMAKE_BUILD_TYPE MATCHES Release)
INCLUDE_DIRECTORIES(${KsdkDir}/examples)
INCLUDE_DIRECTORIES(${KsdkDir}/examples/frdmkl03z)
INCLUDE_DIRECTORIES(${KsdkDir})
INCLUDE_DIRECTORIES(${IncludeDir})
ENDIF()
# ADD_EXECUTABLE

View File

@@ -83,6 +83,7 @@
<listOptionValue builtIn="false" value="../../../../lib/KSDK_1.3_FRDM-KL03Z/examples"/>
<listOptionValue builtIn="false" value="../../../../lib/KSDK_1.3_FRDM-KL03Z/examples/frdmkl03z"/>
<listOptionValue builtIn="false" value="../../../../lib/KSDK_1.3_FRDM-KL03Z"/>
<listOptionValue builtIn="false" value="../../../../include"/>
</option>
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.std.933718024" name="Language standard" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.std" useByScannerDiscovery="true" value="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.std.gnu99" valueType="enumerated"/>
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.defs.4702060583" name="Defined symbols (-D)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.defs" useByScannerDiscovery="false" valueType="definedSymbols">
@@ -227,6 +228,7 @@
<listOptionValue builtIn="false" value="../../../../lib/KSDK_1.3_FRDM-KL03Z/examples"/>
<listOptionValue builtIn="false" value="../../../../lib/KSDK_1.3_FRDM-KL03Z/examples/frdmkl03z"/>
<listOptionValue builtIn="false" value="../../../../lib/KSDK_1.3_FRDM-KL03Z"/>
<listOptionValue builtIn="false" value="../../../../include"/>
</option>
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.std.997197032" name="Language standard" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.std" useByScannerDiscovery="true" value="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.std.gnu99" valueType="enumerated"/>
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.defs.9999202301" name="Defined symbols (-D)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.defs" useByScannerDiscovery="false" valueType="definedSymbols">

View File

@@ -80,11 +80,21 @@
<type>1</type>
<locationURI>PARENT-3-PROJECT_LOC/lib/KSDK_1.3_FRDM-KL03Z/examples/frdmkl03z/pin_mux.h</locationURI>
</link>
<link>
<name>source/i2c.h</name>
<type>1</type>
<locationURI>PARENT-3-PROJECT_LOC/include/i2c.h</locationURI>
</link>
<link>
<name>source/main.c</name>
<type>1</type>
<locationURI>PARENT-2-PROJECT_LOC/main.c</locationURI>
</link>
<link>
<name>source/main.h</name>
<type>1</type>
<locationURI>PARENT-2-PROJECT_LOC/main.h</locationURI>
</link>
<link>
<name>startup/startup.c</name>
<type>1</type>

View File

@@ -1,8 +1,52 @@
#include "board.h"
#include "fsl_clock_manager.h"
#include "fsl_i2c_slave_driver.h"
#include "fsl_i2c_shared_function.h"
#include "i2c.h"
#include "main.h"
uint8_t isSw2Pressed;
uint8_t isSw3Pressed;
uint8_t buffer[I2C_DATA_LENGTH];
void I2C0_IRQHandler(void)
{
I2C_DRV_IRQHandler(I2C0_IDX);
}
static void i2c_slave_callback(uint8_t instance, i2c_slave_event_t i2cEvent, void *param)
{
i2c_slave_state_t *slaveState = I2C_DRV_SlaveGetHandler(instance);
switch (i2cEvent) {
case kI2CSlaveTxReq:
slaveState->txSize = I2C_DATA_LENGTH;
slaveState ->txBuff = buffer;
slaveState ->isTxBusy = true;
buffer[0] = isSw2Pressed;
buffer[1] = isSw3Pressed;
break;
case kI2CSlaveTxEmpty:
slaveState->isTxBusy = false;
break;
default:
break;
}
}
int main(void)
{
// Initialize clock.
CLOCK_SYS_EnablePortClock(PORTA_IDX);
CLOCK_SYS_EnablePortClock(PORTB_IDX);
BOARD_ClockInit();
// Initialize GPIO.
gpio_input_pin_user_config_t inputPin[] =
{
{
@@ -43,16 +87,28 @@ int main(void)
}
};
CLOCK_SYS_EnablePortClock(PORTA_IDX);
CLOCK_SYS_EnablePortClock(PORTB_IDX);
BOARD_ClockInit();
GPIO_DRV_Init(inputPin, outputPin);
// Initialize I2C.
i2c_slave_state_t slave;
i2c_slave_user_config_t userConfig = {
.address = LEFT_KEYBOARD_HALF_I2C_ADDRESS_7BIT,
.slaveCallback = i2c_slave_callback,
.callbackParam = NULL,
.slaveListening = true,
.startStopDetect = true,
};
configure_i2c_pins(0);
I2C_DRV_SlaveInit(BOARD_I2C_INSTANCE, &userConfig, &slave);
// Update switch states and toggle LEDs accordingly.
while (1) {
uint8_t isSw2Pressed = GPIO_DRV_ReadPinInput(kGpioSW2);
uint8_t isSw3Pressed = GPIO_DRV_ReadPinInput(kGpioSW3);
isSw2Pressed = GPIO_DRV_ReadPinInput(kGpioSW2);
isSw3Pressed = GPIO_DRV_ReadPinInput(kGpioSW3);
GPIO_DRV_WritePinOutput(kGpioLED1, isSw2Pressed);
GPIO_DRV_WritePinOutput(kGpioLED3, isSw3Pressed);
}

6
left/main.h Normal file
View File

@@ -0,0 +1,6 @@
#ifndef __MAIN_H__
#define __MAIN_H__
#define I2C_DATA_LENGTH 2
#endif