Library for LCD ACM1602NI connected using I2C on Nucleo F401 is not to be found. Using I2C class offered by mbed, I cannot program for this LCD on Nucleo F401. So I programmed for this LCD to control by direct accsessing registors for I2C in STM32F401RE. Nucleo F401 で使用できる,I2C 接続の LCD ACM1602NI 用のライブラリ.このライブラリでは,I2C クラスのコンストラクタとクロック周波数設定のメンバ関数は使っているが,その他のメンバ関数などは使っていない.その理由は,タイミングの関係だと思うが,I2C クラスのメンバ関数では正常に動くプログラムを,どうしても作れないことによる.しょうがないので,MCU の I2C 関係のレジスタに直接アクセスするようなプログラムを作ったたところ,動くようになった.Nucleo の F401RE 以外については確認していない.動かない場合は,I2C 用のレジスタのアドレスを,使っている MCU に応じて書きかえる必要がある.

Dependents:   ACM1602NI_Nucleo_Demo

Committer:
MikamiUitOpen
Date:
Thu Aug 28 08:53:52 2014 +0000
Revision:
0:8167316a0a40
Child:
1:cace20837286
1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:8167316a0a40 1 //------------------------------------------------------
MikamiUitOpen 0:8167316a0a40 2 // Class for LCD, ACM1602NI
MikamiUitOpen 0:8167316a0a40 3 //
MikamiUitOpen 0:8167316a0a40 4 // 2014/08/27, Copyright (c) 2014 MIKAMI, Naoki
MikamiUitOpen 0:8167316a0a40 5 //------------------------------------------------------
MikamiUitOpen 0:8167316a0a40 6
MikamiUitOpen 0:8167316a0a40 7 #include "ACM1602NI.hpp"
MikamiUitOpen 0:8167316a0a40 8
MikamiUitOpen 0:8167316a0a40 9 namespace Mikami
MikamiUitOpen 0:8167316a0a40 10 {
MikamiUitOpen 0:8167316a0a40 11 // Constructor
MikamiUitOpen 0:8167316a0a40 12 Acm1602Ni::Acm1602Ni(PinName sda, PinName scl, uint32_t clock,
MikamiUitOpen 0:8167316a0a40 13 bool cursor, bool blink)
MikamiUitOpen 0:8167316a0a40 14 : i2c_(sda, scl)
MikamiUitOpen 0:8167316a0a40 15 {
MikamiUitOpen 0:8167316a0a40 16 uint32_t i2cAddr = 0;
MikamiUitOpen 0:8167316a0a40 17 if ( ((sda == PB_9) || (sda == PB_7)) &&
MikamiUitOpen 0:8167316a0a40 18 ((scl == PB_8) || (scl == PB_6)) )
MikamiUitOpen 0:8167316a0a40 19 i2cAddr = I2C_1; // I2C1 used
MikamiUitOpen 0:8167316a0a40 20 if ( (sda == PB_3) && (scl == PB_10) )
MikamiUitOpen 0:8167316a0a40 21 i2cAddr = I2C_2; // I2C2 used
MikamiUitOpen 0:8167316a0a40 22 if ( ((sda == PC_9) || (sda == PB_4)) &&
MikamiUitOpen 0:8167316a0a40 23 (scl == PA_8) )
MikamiUitOpen 0:8167316a0a40 24 i2cAddr = I2C_3; // I2C3 used
MikamiUitOpen 0:8167316a0a40 25
MikamiUitOpen 0:8167316a0a40 26 i2c_cr1_ = (uint16_t *)i2cAddr;
MikamiUitOpen 0:8167316a0a40 27 i2c_dr_ = (uint16_t *)(i2cAddr + 0x10);
MikamiUitOpen 0:8167316a0a40 28 i2c_sr1_ = (uint16_t *)(i2cAddr + 0x14);
MikamiUitOpen 0:8167316a0a40 29 i2c_sr2_ = (uint16_t *)(i2cAddr + 0x18);
MikamiUitOpen 0:8167316a0a40 30
MikamiUitOpen 0:8167316a0a40 31 connected_ = Clear(); // Clear display
MikamiUitOpen 0:8167316a0a40 32 if (!connected_) return;
MikamiUitOpen 0:8167316a0a40 33
MikamiUitOpen 0:8167316a0a40 34 if (clock != 100000) i2c_.frequency(clock);
MikamiUitOpen 0:8167316a0a40 35
MikamiUitOpen 0:8167316a0a40 36 WriteCmd(0x38); // data length:8-bit, 2-line, 5×8 dots
MikamiUitOpen 0:8167316a0a40 37 WriteCmd(0x0C | (cursor << 1) | blink);
MikamiUitOpen 0:8167316a0a40 38 WriteCmd(0x06); // cursor direction: rightward
MikamiUitOpen 0:8167316a0a40 39 }
MikamiUitOpen 0:8167316a0a40 40
MikamiUitOpen 0:8167316a0a40 41 // All clear
MikamiUitOpen 0:8167316a0a40 42 bool Acm1602Ni::Clear()
MikamiUitOpen 0:8167316a0a40 43 {
MikamiUitOpen 0:8167316a0a40 44 bool ok = WriteCmd(0x01);
MikamiUitOpen 0:8167316a0a40 45 wait_ms(50);
MikamiUitOpen 0:8167316a0a40 46 return ok;
MikamiUitOpen 0:8167316a0a40 47 }
MikamiUitOpen 0:8167316a0a40 48
MikamiUitOpen 0:8167316a0a40 49 // Write string from specified position
MikamiUitOpen 0:8167316a0a40 50 void Acm1602Ni::WriteString(const char str[], uint8_t x, uint8_t y)
MikamiUitOpen 0:8167316a0a40 51 {
MikamiUitOpen 0:8167316a0a40 52 SetXY(x, y);
MikamiUitOpen 0:8167316a0a40 53 for (int n=0; n<16; n++)
MikamiUitOpen 0:8167316a0a40 54 if (str[n] == 0) break;
MikamiUitOpen 0:8167316a0a40 55 else WriteChar(str[n]);
MikamiUitOpen 0:8167316a0a40 56 }
MikamiUitOpen 0:8167316a0a40 57
MikamiUitOpen 0:8167316a0a40 58 //------------------------------------------------------------------------------
MikamiUitOpen 0:8167316a0a40 59 // Following: private functions
MikamiUitOpen 0:8167316a0a40 60
MikamiUitOpen 0:8167316a0a40 61 // Send command and data
MikamiUitOpen 0:8167316a0a40 62 bool Acm1602Ni::LcdTx(uint8_t cmdData, uint8_t data)
MikamiUitOpen 0:8167316a0a40 63 {
MikamiUitOpen 0:8167316a0a40 64 if (!Start()) return false;
MikamiUitOpen 0:8167316a0a40 65 TxDR(cmdData); // "cmdData" defines king of "data" in next statement
MikamiUitOpen 0:8167316a0a40 66 TxDR(data); // Send command or RAM dataspecify specified by "cmdData"
MikamiUitOpen 0:8167316a0a40 67 wait_us(500); // indispensable
MikamiUitOpen 0:8167316a0a40 68 SetCR1(0x200); // Generate stop condition
MikamiUitOpen 0:8167316a0a40 69 return true;
MikamiUitOpen 0:8167316a0a40 70 }
MikamiUitOpen 0:8167316a0a40 71
MikamiUitOpen 0:8167316a0a40 72 // Preparation for send of command and data
MikamiUitOpen 0:8167316a0a40 73 bool Acm1602Ni::Start()
MikamiUitOpen 0:8167316a0a40 74 {
MikamiUitOpen 0:8167316a0a40 75 const uint8_t WAIT = 20;
MikamiUitOpen 0:8167316a0a40 76 const uint8_t LENGTH = 10;
MikamiUitOpen 0:8167316a0a40 77 uint8_t n;
MikamiUitOpen 0:8167316a0a40 78
MikamiUitOpen 0:8167316a0a40 79 // wait for I2C not busy
MikamiUitOpen 0:8167316a0a40 80 for (n=0; n<LENGTH; n++)
MikamiUitOpen 0:8167316a0a40 81 {
MikamiUitOpen 0:8167316a0a40 82 wait_us(WAIT);
MikamiUitOpen 0:8167316a0a40 83 if (!Check(i2c_sr2_, 0x02)) break;
MikamiUitOpen 0:8167316a0a40 84 }
MikamiUitOpen 0:8167316a0a40 85 if (n == LENGTH) return false;
MikamiUitOpen 0:8167316a0a40 86
MikamiUitOpen 0:8167316a0a40 87 // Generate start condition
MikamiUitOpen 0:8167316a0a40 88 SetCR1(0x100);
MikamiUitOpen 0:8167316a0a40 89 // Confirm start condition and master mode
MikamiUitOpen 0:8167316a0a40 90 for (n=0; n<LENGTH; n++)
MikamiUitOpen 0:8167316a0a40 91 {
MikamiUitOpen 0:8167316a0a40 92 wait_us(WAIT);
MikamiUitOpen 0:8167316a0a40 93 if (Check(i2c_sr1_, 0x01) && Check(i2c_sr2_, 0x03)) break;
MikamiUitOpen 0:8167316a0a40 94 }
MikamiUitOpen 0:8167316a0a40 95 if (n == LENGTH) return false;
MikamiUitOpen 0:8167316a0a40 96
MikamiUitOpen 0:8167316a0a40 97 // Send slave address
MikamiUitOpen 0:8167316a0a40 98 TxDR(LCD_ADDRESS_);
MikamiUitOpen 0:8167316a0a40 99 // Confirm on transmit mode
MikamiUitOpen 0:8167316a0a40 100 for (n=0; n<LENGTH; n++)
MikamiUitOpen 0:8167316a0a40 101 {
MikamiUitOpen 0:8167316a0a40 102 wait_us(WAIT);
MikamiUitOpen 0:8167316a0a40 103 if (Check(i2c_sr1_, 0x82) && Check(i2c_sr2_, 0x07)) break;
MikamiUitOpen 0:8167316a0a40 104 }
MikamiUitOpen 0:8167316a0a40 105 if (n == LENGTH) return false;
MikamiUitOpen 0:8167316a0a40 106
MikamiUitOpen 0:8167316a0a40 107 return true;
MikamiUitOpen 0:8167316a0a40 108 }
MikamiUitOpen 0:8167316a0a40 109 }
MikamiUitOpen 0:8167316a0a40 110
MikamiUitOpen 0:8167316a0a40 111