Compare commits
5 Commits
b2d10f5e5e
...
I2C
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cb232ea55e | ||
|
|
8ce717033a | ||
|
|
75132eb040 | ||
|
|
7b32859c88 | ||
|
|
d4136f0761 |
@@ -11,9 +11,56 @@
|
|||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
|
//Overall init function for SHAL --------------------------
|
||||||
|
|
||||||
|
void SHAL_init();
|
||||||
|
|
||||||
|
//---------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//Universal structs and defines ---------------------------
|
//Universal structs and defines ---------------------------
|
||||||
|
|
||||||
|
typedef bool (*condition_fn_t)(void);
|
||||||
|
|
||||||
|
#define SHAL_WAIT_FOR_CONDITION_US(cond, timeout_us) \
|
||||||
|
SHAL_wait_for_condition_us([&](){ return (cond); }, (timeout_us))
|
||||||
|
|
||||||
|
#define SHAL_WAIT_FOR_CONDITION_MS(cond, timeout_ms) \
|
||||||
|
SHAL_wait_for_condition_ms([&](){ return (cond); }, (timeout_ms))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//Currently configures systick to count down in microseconds
|
||||||
|
void systick_init();
|
||||||
|
|
||||||
|
//Max of 16ms, use SHAL_delay_ms for longer delay
|
||||||
|
void SHAL_delay_us(uint32_t us);
|
||||||
|
|
||||||
|
void SHAL_delay_ms(uint32_t ms);
|
||||||
|
|
||||||
|
template<typename Condition>
|
||||||
|
bool SHAL_wait_for_condition_us(Condition cond, uint32_t timeout_us) {
|
||||||
|
while (timeout_us--) {
|
||||||
|
if (cond()) {
|
||||||
|
return true; // success
|
||||||
|
}
|
||||||
|
SHAL_delay_us(1);
|
||||||
|
}
|
||||||
|
return false; // timeout
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Condition>
|
||||||
|
bool SHAL_wait_for_condition_ms(Condition cond, uint32_t timeout_ms) {
|
||||||
|
while (timeout_ms--) {
|
||||||
|
if (cond()) {
|
||||||
|
return true; // success
|
||||||
|
}
|
||||||
|
SHAL_delay_ms(1);
|
||||||
|
}
|
||||||
|
return false; // timeout
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------
|
//---------------------------------------------------------
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,8 @@
|
|||||||
#ifndef SHMINGO_HAL_SHAL_I2C_H
|
#ifndef SHMINGO_HAL_SHAL_I2C_H
|
||||||
#define SHMINGO_HAL_SHAL_I2C_H
|
#define SHMINGO_HAL_SHAL_I2C_H
|
||||||
|
|
||||||
|
#include <cstdio>
|
||||||
|
|
||||||
#include "SHAL_CORE.h"
|
#include "SHAL_CORE.h"
|
||||||
#include "SHAL_I2C_REG.h"
|
#include "SHAL_I2C_REG.h"
|
||||||
|
|
||||||
@@ -17,16 +19,28 @@ public:
|
|||||||
|
|
||||||
void init(I2C_Pair pair) volatile;
|
void init(I2C_Pair pair) volatile;
|
||||||
|
|
||||||
///
|
/// General I2C function to send commands to a device, then read back any returned data if necessary
|
||||||
/// \param addr I2C address of slave device
|
/// \param addr address of slave device
|
||||||
/// \param reg Address of register in slave device to write to
|
/// \param writeData pointer to array of write commands
|
||||||
/// \param data Data to write to slave register
|
/// \param writeLen number of write commands
|
||||||
void masterTransmit(uint8_t addr, uint8_t reg, uint8_t data);
|
/// \param readData pointer to buffer to write received data to
|
||||||
|
/// \param readLen number of bytes to be read
|
||||||
|
void masterWriteRead(uint8_t addr,const uint8_t* writeData, size_t writeLen, uint8_t* readData, size_t readLen);
|
||||||
|
|
||||||
|
uint8_t masterWriteReadByte(uint8_t addr, const uint8_t* writeData, size_t writeLen);
|
||||||
|
|
||||||
|
/// Function to write an array of commands to an I2C device
|
||||||
|
/// \param addr Address of slave device
|
||||||
|
/// \param writeData Pointer to array of commands
|
||||||
|
/// \param writeLen Number of commands
|
||||||
|
void masterWrite(uint8_t addr, const uint8_t* writeData, uint8_t writeLen);
|
||||||
|
|
||||||
|
/// Function to read bytes from an I2C device
|
||||||
|
/// \param addr Address of slave device
|
||||||
|
/// \param readBuffer Pointer to buffer where data will be placed
|
||||||
|
/// \param bytesToRead Number of bytes to read
|
||||||
|
void masterRead(uint8_t addr, uint8_t* readBuffer, uint8_t bytesToRead);
|
||||||
|
|
||||||
///
|
|
||||||
/// \param addr I2C address of slave device
|
|
||||||
/// \param reg Register to read data from
|
|
||||||
uint8_t masterReceive(uint8_t addr, uint8_t reg);
|
|
||||||
|
|
||||||
//Manually set the clock configuration. Refer to your MCU's reference manual for examples
|
//Manually set the clock configuration. Refer to your MCU's reference manual for examples
|
||||||
void setClockConfig(uint8_t prescaler, uint8_t dataSetupTime, uint8_t dataHoldTime, uint8_t SCLHighPeriod, uint8_t SCLLowPeriod);
|
void setClockConfig(uint8_t prescaler, uint8_t dataSetupTime, uint8_t dataHoldTime, uint8_t SCLHighPeriod, uint8_t SCLLowPeriod);
|
||||||
|
|||||||
@@ -11,5 +11,6 @@
|
|||||||
#include "SHAL_TIM.h"
|
#include "SHAL_TIM.h"
|
||||||
#include "SHAL_GPIO.h"
|
#include "SHAL_GPIO.h"
|
||||||
#include "SHAL_UART.h"
|
#include "SHAL_UART.h"
|
||||||
|
#include "SHAL_I2C.h"
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
42
SHAL/Src/Core/SHAL_CORE.cpp
Normal file
42
SHAL/Src/Core/SHAL_CORE.cpp
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
//
|
||||||
|
// Created by Luca on 9/15/2025.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "SHAL_CORE.h"
|
||||||
|
|
||||||
|
void SHAL_init(){
|
||||||
|
systick_init(); //Just this for now
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void systick_init(){
|
||||||
|
SysTick->CTRL = 0; //Disable first
|
||||||
|
SysTick->LOAD = 0xFFFFFF; //Max 24-bit
|
||||||
|
SysTick->VAL = 0; //Clear
|
||||||
|
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SHAL_delay_us(uint32_t us){
|
||||||
|
uint32_t ticks = us * (SystemCoreClock / 1000000U);
|
||||||
|
uint32_t start = SysTick->VAL;
|
||||||
|
|
||||||
|
//Calculate target value (may wrap around)
|
||||||
|
uint32_t target = (start >= ticks) ? (start - ticks) : (start + 0x01000000 - ticks);
|
||||||
|
target &= 0x00FFFFFF;
|
||||||
|
|
||||||
|
//Wait until we reach the target
|
||||||
|
if (start >= ticks) {
|
||||||
|
//No wraparound case
|
||||||
|
while (SysTick->VAL > target) {}
|
||||||
|
} else {
|
||||||
|
while (SysTick->VAL <= start) {} //Wait for wraparound
|
||||||
|
while (SysTick->VAL > target) {} //Wait for target
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHAL_delay_ms(uint32_t ms){
|
||||||
|
while(ms-- > 0){
|
||||||
|
SHAL_delay_us(1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,15 +5,21 @@
|
|||||||
#include "SHAL_I2C.h"
|
#include "SHAL_I2C.h"
|
||||||
#include "SHAL_GPIO.h"
|
#include "SHAL_GPIO.h"
|
||||||
|
|
||||||
|
#include "SHAL_UART.h"
|
||||||
|
|
||||||
void SHAL_I2C::init(I2C_Pair pair) volatile {
|
void SHAL_I2C::init(I2C_Pair pair) volatile {
|
||||||
m_I2CPair = pair;
|
m_I2CPair = pair;
|
||||||
|
|
||||||
SHAL_I2C_Pair I2CPair = getI2CPair(pair); //Get the UART_PAIR information to be initialized
|
SHAL_I2C_Pair I2CPair = getI2CPair(pair); //Get the I2C_PAIR information to be initialized
|
||||||
|
|
||||||
//Get the SHAL_GPIO pins for this SHAL_I2C setup
|
//Get the SHAL_GPIO pins for this SHAL_I2C setup
|
||||||
GPIO_Key SCL_Key = I2CPair.SCL_Key; //SCL pin
|
GPIO_Key SCL_Key = I2CPair.SCL_Key; //SCL pin
|
||||||
GPIO_Key SDA_Key = I2CPair.SDA_Key; //SDA pin
|
GPIO_Key SDA_Key = I2CPair.SDA_Key; //SDA pin
|
||||||
|
|
||||||
|
SHAL_I2C_Enable_Reg pairI2CEnable = getI2CEnableReg(pair); //Register and mask to enable the I2C peripheral
|
||||||
|
|
||||||
|
*pairI2CEnable.reg &= ~pairI2CEnable.mask; //Enable I2C peripheral clock
|
||||||
|
|
||||||
GET_GPIO(SCL_Key).setPinMode(PinMode::ALTERNATE_FUNCTION_MODE); //Implicitly initializes and enables GPIO bus
|
GET_GPIO(SCL_Key).setPinMode(PinMode::ALTERNATE_FUNCTION_MODE); //Implicitly initializes and enables GPIO bus
|
||||||
GET_GPIO(SDA_Key).setPinMode(PinMode::ALTERNATE_FUNCTION_MODE);
|
GET_GPIO(SDA_Key).setPinMode(PinMode::ALTERNATE_FUNCTION_MODE);
|
||||||
|
|
||||||
@@ -30,13 +36,12 @@ void SHAL_I2C::init(I2C_Pair pair) volatile {
|
|||||||
GET_GPIO(SCL_Key).setInternalResistor(InternalResistorType::PULLUP);
|
GET_GPIO(SCL_Key).setInternalResistor(InternalResistorType::PULLUP);
|
||||||
GET_GPIO(SDA_Key).setInternalResistor(InternalResistorType::PULLUP);
|
GET_GPIO(SDA_Key).setInternalResistor(InternalResistorType::PULLUP);
|
||||||
|
|
||||||
SHAL_I2C_Enable_Reg pairI2CEnable = getI2CEnableReg(pair); //Register and mask to enable the I2C peripheral
|
|
||||||
SHAL_I2C_Reset_Reg pairI2CReset = getI2CResetReg(pair);
|
SHAL_I2C_Reset_Reg pairI2CReset = getI2CResetReg(pair);
|
||||||
|
|
||||||
*pairI2CReset.reg |= pairI2CReset.mask; //Reset peripheral
|
|
||||||
*pairI2CEnable.reg |= pairI2CEnable.mask; //Enable I2C peripheral clock
|
*pairI2CEnable.reg |= pairI2CEnable.mask; //Enable I2C peripheral clock
|
||||||
|
|
||||||
I2CPair.I2CReg->CR1 |= I2C_CR1_PE; //Enable I2C peripheral
|
*pairI2CReset.reg |= pairI2CReset.mask; //Reset peripheral
|
||||||
|
*pairI2CReset.reg &= ~pairI2CReset.mask; //Reset peripheral
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHAL_I2C::setClockConfig(uint8_t prescaler, uint8_t dataSetupTime, uint8_t dataHoldTime, uint8_t SCLHighPeriod, uint8_t SCLLowPeriod) {
|
void SHAL_I2C::setClockConfig(uint8_t prescaler, uint8_t dataSetupTime, uint8_t dataHoldTime, uint8_t SCLHighPeriod, uint8_t SCLLowPeriod) {
|
||||||
@@ -48,65 +53,82 @@ void SHAL_I2C::setClockConfig(uint8_t prescaler, uint8_t dataSetupTime, uint8_t
|
|||||||
*clockReg.reg |= (dataHoldTime << clockReg.dataHoldTime_offset);
|
*clockReg.reg |= (dataHoldTime << clockReg.dataHoldTime_offset);
|
||||||
*clockReg.reg |= (SCLHighPeriod << clockReg.SCLHighPeriod_offset);
|
*clockReg.reg |= (SCLHighPeriod << clockReg.SCLHighPeriod_offset);
|
||||||
*clockReg.reg |= (SCLLowPeriod << clockReg.SCLLowPeriod_offset);
|
*clockReg.reg |= (SCLLowPeriod << clockReg.SCLLowPeriod_offset);
|
||||||
|
|
||||||
|
getI2CPair(m_I2CPair).I2CReg->CR1 |= I2C_CR1_PE; //Enable I2C peripheral
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHAL_I2C::setClockConfig(uint32_t configuration) {
|
void SHAL_I2C::setClockConfig(uint32_t configuration) {
|
||||||
*getI2CTimerReg(m_I2CPair).reg = configuration;
|
*getI2CTimerReg(m_I2CPair).reg = configuration;
|
||||||
|
|
||||||
|
getI2CPair(m_I2CPair).I2CReg->CR1 |= I2C_CR1_PE; //Enable I2C peripheral
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHAL_I2C::masterTransmit(uint8_t addr, uint8_t reg, uint8_t data) {
|
void SHAL_I2C::masterWriteRead(uint8_t addr,const uint8_t* writeData, size_t writeLen, uint8_t* readData, size_t readLen) {
|
||||||
|
|
||||||
volatile I2C_TypeDef* I2CPeripheral = getI2CPair(m_I2CPair).I2CReg;
|
volatile I2C_TypeDef* I2CPeripheral = getI2CPair(m_I2CPair).I2CReg;
|
||||||
|
|
||||||
//Wait until not busy
|
if(!SHAL_WAIT_FOR_CONDITION_MS((I2CPeripheral->ISR & I2C_ISR_BUSY) == 0, 100)){
|
||||||
while (I2CPeripheral->ISR & I2C_ISR_BUSY);
|
SHAL_UART2.sendString("I2C timed out waiting for not busy\r\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
//Send start + slave address
|
//Write phase
|
||||||
I2CPeripheral->CR2 = (addr << 1) | (2 << I2C_CR2_NBYTES_Pos) | I2C_CR2_START | I2C_CR2_AUTOEND; //Pack bits in compliance with I2C format
|
if (writeLen > 0) {
|
||||||
|
//Configure: NBYTES = wlen, write mode, START
|
||||||
|
I2CPeripheral->CR2 = (addr << 1) | (writeLen << I2C_CR2_NBYTES_Pos) | I2C_CR2_START;
|
||||||
|
|
||||||
//Wait until TX ready
|
for (size_t i = 0; i < writeLen; i++) {
|
||||||
while (!(I2CPeripheral->ISR & I2C_ISR_TXIS));
|
if(!SHAL_WAIT_FOR_CONDITION_MS((I2CPeripheral->ISR & I2C_ISR_TXIS) != 0, 100)){
|
||||||
|
SHAL_UART2.sendString("I2C timed out waiting for TX\r\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
I2CPeripheral->TXDR = writeData[i];
|
||||||
|
}
|
||||||
|
|
||||||
//Send register address
|
//Wait until transfer complete
|
||||||
I2CPeripheral->TXDR = reg;
|
if(!SHAL_WAIT_FOR_CONDITION_MS((I2CPeripheral->ISR & I2C_ISR_TC) != 0, 100)){
|
||||||
|
SHAL_UART2.sendString("I2C timed out waiting for TC\r\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//Wait until TX ready
|
//Read phase
|
||||||
while (!(I2CPeripheral->ISR & I2C_ISR_TXIS));
|
if (readLen > 0) {
|
||||||
|
|
||||||
//Send data to write to register
|
SHAL_UART2.sendString("Read initiated\r\n");
|
||||||
I2CPeripheral->TXDR = data;
|
|
||||||
|
I2CPeripheral->CR2 &= ~(I2C_CR2_NBYTES | I2C_CR2_SADD | I2C_CR2_RD_WRN);
|
||||||
|
I2CPeripheral->CR2 |= (addr << 1) |
|
||||||
|
I2C_CR2_RD_WRN |
|
||||||
|
(readLen << I2C_CR2_NBYTES_Pos) |
|
||||||
|
I2C_CR2_START | I2C_CR2_AUTOEND;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < readLen; i++) {
|
||||||
|
if(!SHAL_WAIT_FOR_CONDITION_MS((I2CPeripheral->ISR & I2C_ISR_RXNE) != 0 , 100)){
|
||||||
|
SHAL_UART2.sendString("I2C timed out waiting for RXNE\r\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
SHAL_UART2.sendString("Read byte");
|
||||||
|
readData[i] = static_cast<uint8_t>(I2CPeripheral->RXDR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
I2CPeripheral->CR2 |= I2C_CR2_STOP;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHAL_I2C::masterWrite(uint8_t addr, const uint8_t *writeData, uint8_t writeLen) {
|
||||||
|
masterWriteRead(addr,writeData,writeLen,nullptr,0);
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t SHAL_I2C::masterReceive(uint8_t addr, uint8_t reg) {
|
void SHAL_I2C::masterRead(uint8_t addr, uint8_t *readBuffer, uint8_t bytesToRead) {
|
||||||
|
masterWriteRead(addr,nullptr,0,readBuffer,bytesToRead);
|
||||||
|
}
|
||||||
|
|
||||||
volatile I2C_TypeDef* I2CPeripheral = getI2CPair(m_I2CPair).I2CReg;
|
uint8_t SHAL_I2C::masterWriteReadByte(uint8_t addr, const uint8_t *writeData, size_t writeLen) {
|
||||||
|
uint8_t val = 0;
|
||||||
//Send register address with write
|
masterWriteRead(addr, writeData, writeLen, &val, 1);
|
||||||
|
return val;
|
||||||
//Wait for bus
|
|
||||||
while (I2CPeripheral->ISR & I2C_ISR_BUSY);
|
|
||||||
|
|
||||||
//Send start with I2C config
|
|
||||||
I2CPeripheral->CR2 = (addr << 1) | (1 << I2C_CR2_NBYTES_Pos) | I2C_CR2_START;
|
|
||||||
|
|
||||||
//Wait for transmit
|
|
||||||
while (!(I2CPeripheral->ISR & I2C_ISR_TXIS));
|
|
||||||
|
|
||||||
//Set address to read from
|
|
||||||
I2CPeripheral->TXDR = reg;
|
|
||||||
|
|
||||||
//Wait for transfer to complete
|
|
||||||
while (!(I2CPeripheral->ISR & I2C_ISR_TC));
|
|
||||||
|
|
||||||
//Restart in read mode, auto end
|
|
||||||
I2CPeripheral->CR2 = (addr << 1) | I2C_CR2_RD_WRN |
|
|
||||||
(1 << I2C_CR2_NBYTES_Pos) |
|
|
||||||
I2C_CR2_START | I2C_CR2_AUTOEND;
|
|
||||||
|
|
||||||
//Wait
|
|
||||||
while (!(I2C1->ISR & I2C_ISR_RXNE));
|
|
||||||
return (uint8_t)I2C1->RXDR;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SHAL_I2C& I2CManager::get(uint8_t I2CBus) {
|
SHAL_I2C& I2CManager::get(uint8_t I2CBus) {
|
||||||
|
|||||||
@@ -1,10 +1,44 @@
|
|||||||
#include "SHAL.h"
|
#include "SHAL.h"
|
||||||
#include "stm32f0xx.h"
|
#include "stm32f0xx.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
void c3Interrupt(){
|
void c3Interrupt(){
|
||||||
PIN(A5).toggle();
|
SHAL_UART2.sendString("Begin\r\n");
|
||||||
UART(2).sendString("New test");
|
|
||||||
|
uint8_t cmd[3] = {0xAC, 0x33, 0x00};
|
||||||
|
SHAL_I2C1.masterWrite(0x38, cmd, 3);
|
||||||
|
|
||||||
|
SHAL_delay_ms(100);
|
||||||
|
|
||||||
|
uint8_t dht_buf[7] = {0};
|
||||||
|
|
||||||
|
//Read 7 bytes (status + 5 data + CRC)
|
||||||
|
SHAL_I2C1.masterRead(0x38, dht_buf, 7);
|
||||||
|
|
||||||
|
//Parse humidity (20 bits)
|
||||||
|
uint32_t rawHumidity = ((uint32_t)dht_buf[1] << 12) |
|
||||||
|
((uint32_t)dht_buf[2] << 4) |
|
||||||
|
((uint32_t)dht_buf[3] >> 4);
|
||||||
|
|
||||||
|
uint32_t rawTemp = (((uint32_t)dht_buf[3] & 0x0F) << 16) |
|
||||||
|
((uint32_t)dht_buf[4] << 8) |
|
||||||
|
((uint32_t)dht_buf[5]);
|
||||||
|
|
||||||
|
// Use 64-bit intermediate to avoid overflow
|
||||||
|
uint32_t hum_hundredths = (uint32_t)(((uint64_t)rawHumidity * 10000ULL) >> 20);
|
||||||
|
int32_t temp_hundredths = (int32_t)((((uint64_t)rawTemp * 20000ULL) >> 20) - 5000);
|
||||||
|
|
||||||
|
char out[80];
|
||||||
|
sprintf(out, "rawH=0x%05lX rawT=0x%05lX\r\n",
|
||||||
|
(unsigned long)rawHumidity, (unsigned long)rawTemp);
|
||||||
|
SHAL_UART2.sendString(out);
|
||||||
|
|
||||||
|
// print as X.YY
|
||||||
|
sprintf(out, "Temp: %ld.%02ld C, Hum: %ld.%02ld %%\r\n",
|
||||||
|
(long)(temp_hundredths / 100), (long)(abs(temp_hundredths % 100)),
|
||||||
|
(long)(hum_hundredths / 100), (long)(hum_hundredths % 100));
|
||||||
|
SHAL_UART2.sendString(out);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tim2Handler(){
|
void tim2Handler(){
|
||||||
@@ -13,10 +47,15 @@ void tim2Handler(){
|
|||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
|
|
||||||
|
SHAL_init();
|
||||||
|
|
||||||
//Setup UART2 (used by nucleo devices for USB comms)
|
//Setup UART2 (used by nucleo devices for USB comms)
|
||||||
SHAL_UART2.init(UART_Pair::Tx2A2_Rx2A3);
|
SHAL_UART2.init(UART_Pair::Tx2A2_Rx2A3);
|
||||||
SHAL_UART2.begin(115200);
|
SHAL_UART2.begin(115200);
|
||||||
|
|
||||||
|
SHAL_I2C1.init(I2C_Pair::SCL1B6_SDA1B7);
|
||||||
|
SHAL_I2C1.setClockConfig(0x2000090E);
|
||||||
|
|
||||||
//Use pin C3 to trigger a function on external interrupt
|
//Use pin C3 to trigger a function on external interrupt
|
||||||
PIN(C3).useAsExternalInterrupt(TriggerMode::RISING_EDGE,c3Interrupt);
|
PIN(C3).useAsExternalInterrupt(TriggerMode::RISING_EDGE,c3Interrupt);
|
||||||
|
|
||||||
@@ -27,6 +66,25 @@ int main() {
|
|||||||
PIN(A4).setPinMode(PinMode::OUTPUT_MODE);
|
PIN(A4).setPinMode(PinMode::OUTPUT_MODE);
|
||||||
PIN(A5).setPinMode(PinMode::OUTPUT_MODE);
|
PIN(A5).setPinMode(PinMode::OUTPUT_MODE);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
SHAL_delay_ms(3000); //Wait 100 ms from datasheet
|
||||||
|
|
||||||
|
uint8_t cmd = 0x71;
|
||||||
|
uint8_t status = 0;
|
||||||
|
|
||||||
|
SHAL_I2C1.masterWriteRead(0x38, &cmd, 1, &status, 1);
|
||||||
|
|
||||||
|
char statusString[32];
|
||||||
|
sprintf(statusString, "Status = 0x%02X\r\n", status);
|
||||||
|
SHAL_UART2.sendString(statusString);
|
||||||
|
|
||||||
|
|
||||||
|
SHAL_delay_ms(10);
|
||||||
|
|
||||||
|
c3Interrupt();
|
||||||
|
//End setup
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
__WFI();
|
__WFI();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user