STM32でSC1602をI2C制御する
STM32でI2CをS/Wで制御する「S/W I2C」を紹介しました。今回はS/W I2Cを使って16×2行のSC1602互換 LEDディスプレイを制御する手順を紹介します。Arduino用ではありません。 S… 続きを読む »
STM32でI2CをS/Wで制御する「S/W I2C」を紹介しました。今回はS/W I2Cを使って16×2行のSC1602互換 LEDディスプレイを制御する手順を紹介します。Arduino用ではありません。 S… 続きを読む »
STM32F103にプログラムを書き込んだり、デバッグするのにST-LINKを使用してます。Blue Pillボードは、書き込み/デバッグ用にVCC, GND,DIO,CLKの4ピンが用意されています。デバッグしていると… 続きを読む »
複数のデバイスを接続して使いやすように、C++でプログラムする事にします。SW_I2C Classを定義します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
/* * sw_i2c.h * * Created on: Sep 18, 2019 * Author: http://www.e-momonga.com/honkytonk * Copyright 2019 honkytonk. All right reserved. */ #ifndef INC_SW_I2C_H_ #define INC_SW_I2C_H_ #include <stdint.h> #include "stm32f1xx_hal.h" #ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus }; #endif typedef struct { GPIO_TypeDef* group; uint16_t port; }gpio; #define BIT_00 0x0001 #define BIT_01 0x0002 #define BIT_02 0x0004 #define BIT_03 0x0008 #define BIT_04 0x0010 #define BIT_05 0x0020 #define BIT_06 0x0040 #define BIT_07 0x0080 #define BIT_08 0x0100 #define BIT_09 0x0200 #define BIT_10 0x0400 #define BIT_11 0x0800 #define BIT_12 0x1000 #define BIT_13 0x2000 #define BIT_14 0x4000 #define BIT_15 0x8000 #define IIC_READ_MASK ~0xfe #define IIC_WRITE_MASK 0xfe #define IIC_STATUS_NACK 0x01 #define IIC_STATUS_OK 0x00 #define IIC_STATUS_NO_ERROR 0x00 #ifdef __cplusplus class SW_I2C { private: uint8_t slave_address; gpio scl; gpio sda; uint8_t status; private: void clearStatus(void){this->status = IIC_STATUS_OK;} void start(void); void stop(void); void sendAck(bool anck); bool checkAck(void); void shiftData8Write(uint8_t data); uint8_t* shiftData8Read(uint8_t *rdata, bool ack); void SCL(bool hl){ HAL_GPIO_WritePin(this->scl.group, this->scl.port, hl ? GPIO_PIN_SET : GPIO_PIN_RESET); } void SDA(bool hl){ HAL_GPIO_WritePin(this->sda.group, this->sda.port, hl ? GPIO_PIN_SET : GPIO_PIN_RESET); } bool readSDA(void){ return HAL_GPIO_ReadPin(this->sda.group, this->sda.port) ? true : false; } public: SW_I2C(uint8_t slave, gpio sda, gpio scl){ this->slave_address = slave; this->sda = sda; this->scl = scl; this->status = IIC_STATUS_OK; } void setSlaveAddress(uint8_t address){this->slave_address = address;} void setSclPort(gpio io){ scl = io; } void setSdaPort(gpio io){ sda = io; } uint8_t* burstReadDataBytes(uint8_t address, uint8_t reg_address, uint8_t *rdata, uint8_t len); void burstWriteDataBytes(uint8_t address, uint8_t reg_address, uint8_t *wdata, uint8_t len); uint8_t* readBytes(uint8_t address, uint8_t *rdata, uint8_t len = 1); void writeBytes(uint8_t address, uint8_t *wdata, uint8_t len); bool testReadByte(uint8_t address, uint8_t reg_address, uint8_t *rdata, uint8_t len); uint8_t getStatus(void){return this->status;} uint8_t getSlaveAddress(void){return this->slave_address;} }; #endif #endif /* INC_SW_I2C_H_ */ |
コンストラクタ SW_I2C()には、ス… 続きを読む »
STM32にはペリフェラルとしてH/WのI2Cインターフェース(I/F)が搭載されていますが、STM32がI2Cのマスターになる場合は、H/W I/Fを使わなくてもS/Wで比較的簡単に制御できます。I2C I/Fは数も限… 続きを読む »
半年ほど前にAmazonで購入した 8桁の7セグLEDとスイッチがついたモジュールをようやく動かしてみました。 このモジュールは、8桁の7セグLEDと、赤色LED 8個、スイッチ(Key) 8個がついて、日本のAmazo… 続きを読む »
前回は加工編でした。今回は簡単に設計して見ます…ってもう作ってしまったので振り返り、適当ですね(笑) 念のため断っておきますが、この記事を参考にされて如何なるトラブルや損害が発生しても当方は一切の責任を負いま… 続きを読む »
Raspberry Piを使ったSmart Speakerの作成例は色々なところで紹介されていますね。Alexa SDKだったり、Google Home Kitだったり、Apple HomeKit互換のHomebridg… 続きを読む »
前回は昔話に終始してしまいました。今回は、実際の開発の話にしたいです。 Raspberry piから制御させるため、色々なリモコンフォーマットを生成できるようにします。 UART経由でフォーマットやリモコンコード、繰り返… 続きを読む »
以前購入して眠っていたSTM32VLDISCOVERYを使うことにします。このDiscoveryに使われているSTM32F100RBT6Bは、クロック24MHz, Flash 128KiB, RAM 8KiBと十分な容量… 続きを読む »