Preliminary mbed encoder interface IC class

Dependents:   mbed_QUAD_ENCLIB_TEST Axis Axis_20181108 Axis_version2

include the mbed library with this snippet

#include "mbed.h"
#include "LS7366.h"

SPI spi(p5, p6, p7);   
LS7366 enc1(spi, p19);
LS7366 enc2(spi, p20);
Serial pc(USBTX, USBRX); // tx, rx for serial USB interface to pc

//------------------- MAIN --------------------------------
int main()
{    
    while(1){ 
        pc.printf("enc1 = %ld enc2 = %ld\r\n",enc1.read(), enc2.read());
        wait(.02);
    }//while(1)                        
}//main

Files at this revision

API Documentation at this revision

Comitter:
jebradshaw
Date:
Tue Dec 09 19:08:46 2014 +0000
Child:
1:c627734cf04c
Commit message:
LS7366 preliminary class for mbed

Changed in this revision

LS7366.cpp Show annotated file Show diff for this revision Revisions of this file
LS7366.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LS7366.cpp	Tue Dec 09 19:08:46 2014 +0000
@@ -0,0 +1,171 @@
+// LS7366.cpp for Encoder Class Library
+// J. Bradshaw 20141030
+/* Copyright (c) 2014, jbradshaw (http://mbed.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+*/ 
+#include "LS7366.h"
+
+//----- LS7366 Encoder/Counter Routines --------------------
+
+//Constructor
+LS7366::LS7366(SPI& spi, PinName cs) : _spi(spi), _cs(cs) {
+    _cs = 1;           // Initialize chip select as off (high)
+    _init();
+}
+
+void LS7366::LS7366_cmd(int inst, int reg){
+    char cmd;
+    
+    _spi.format(8, 0);
+    _spi.frequency(2000000);
+    cmd = (inst << 6) | (reg << 3);
+//    printf("\r\ncmd=0X%2X", cmd);
+    _spi.write(cmd);
+}
+
+long LS7366::LS7366_read_counter(){
+    union bytes{
+        char byte_enc[4];
+        long long_enc;
+    }counter;
+    
+    _spi.format(8, 0);
+    _spi.frequency(2000000);
+
+    _cs = 0;    
+    wait_us(1);
+    LS7366_cmd(LOAD,OTR);//cmd = 0xe8, LOAD to OTR
+    _cs = 1;
+    wait_us(1);
+    
+    _cs = 0;        
+
+    wait_us(1);
+    LS7366_cmd(RD,CNTR);  //cmd = 0x60, READ from CNTR
+    counter.byte_enc[3] = _spi.write(0x00);
+    counter.byte_enc[2] = _spi.write(0x00);
+    counter.byte_enc[1] = _spi.write(0x00);
+    counter.byte_enc[0] = _spi.write(0x00);
+
+    _cs = 1;    
+    
+    count = counter.long_enc;  
+    return counter.long_enc;  //return count
+}
+
+void LS7366::LS7366_quad_mode_x4(){
+    
+    _spi.format(8, 0);
+    _spi.frequency(2000000);
+    
+    _cs = 0;    
+   
+    wait_us(1);
+    LS7366_cmd(WR,MDR0);// Write to the MDR0 register
+    _spi.write(0x03); // X4 quadrature count mode
+
+    _cs = 1;    
+}
+
+void LS7366::LS7366_reset_counter(){
+    
+    _spi.format(8, 0);
+    _spi.frequency(2000000);
+    
+    _cs = 0;    
+   
+    wait_us(1);
+    LS7366_cmd(CLR,CNTR);//Clear the counter register
+
+    _cs = 1;    
+
+    wait_us(1);
+    
+    _cs = 0;    
+            
+    wait_us(1);
+    LS7366_cmd(LOAD,CNTR);//
+
+    _cs = 1;    
+}
+
+void LS7366::LS7366_write_DTR(long enc_value)
+{
+    union bytes
+    {
+        char byte_enc[4];
+        long long_enc;
+    }counter;
+    
+    _spi.format(8, 0);
+    _spi.frequency(2000000);
+    
+    counter.long_enc = enc_value;
+    
+    _cs = 0;    
+   
+    wait_us(1);
+    LS7366_cmd(WR,DTR);//
+    _spi.write(counter.byte_enc[3]);
+    _spi.write(counter.byte_enc[2]);
+    _spi.write(counter.byte_enc[1]);
+    _spi.write(counter.byte_enc[0]);
+
+    _cs = 1;         
+    
+    wait_us(1);
+
+    _cs = 0;    
+
+    wait_us(1);
+    LS7366_cmd(LOAD,CNTR);//
+
+    _cs = 1;    
+}
+
+void LS7366::_init(){
+    _spi.frequency(2000000);
+    LS7366_reset_counter();
+    LS7366_quad_mode_x4();       
+    LS7366_write_DTR(0);    
+}
+
+void LS7366::write(long wcount){
+    LS7366_write_DTR(wcount);    
+}
+
+long LS7366::read(){
+    return LS7366_read_counter();    
+}
+
+LS7366& LS7366::operator= (long wcount) { 
+    write(wcount);
+    return *this;
+}
+ 
+LS7366& LS7366::operator= (LS7366& rhs) {
+    write(rhs.read());
+    return *this;
+}
+
+LS7366::operator long() {
+    return read();    
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LS7366.h	Tue Dec 09 19:08:46 2014 +0000
@@ -0,0 +1,80 @@
+// LS7366.h Encoder IC Class Library
+// J. Bradshaw 20141030
+/* Copyright (c) 2014, jbradshaw (http://mbed.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+*/ 
+#include "mbed.h"
+
+#ifndef LS7366_H
+#define LS7366_H
+
+//=============================================================================
+// Four commands for the Instruction Register (B7,B6) - LS7366
+//=============================================================================
+#define CLR     0x00    //Clear Instruction
+#define RD      0x01    //Read Instruction
+#define WR      0x02    //Write Instruction
+#define LOAD    0x03    //Load Instruction
+
+//=============================================================================
+// Register to Select from the Instruction Register (B5,B4,B3) - LS7366
+//=============================================================================
+#define NONE        0x00    //No Register Selected
+#define MDR0        0x01    //Mode Register 0
+#define MDR1        0x02    //Mode Register 1
+#define DTR         0x03    //Data Transfer Register
+#define CNTR        0x04    //Software Configurable Counter Register
+#define OTR         0x05    //Output Transfer Register
+#define STR         0x06    //Status Register
+#define NONE_REG    0x07    //No Register Selected
+
+/**
+ * LS7366 Class.
+ */
+ 
+class LS7366{
+public:
+    /**
+     * Constructor.
+     * @param spi - spi bus
+     * @param _cs - pin to use for chip select
+     */ 
+    LS7366(SPI& spi, PinName _cs);
+    void LS7366_cmd(int inst, int reg);
+    long LS7366_read_counter();
+    void LS7366_quad_mode_x4();
+    void LS7366_reset_counter();
+    void LS7366_write_DTR(long enc_value);    
+    void write(long wcount);  //
+    long read(void);
+    
+    long count;
+    LS7366& operator= (long count);
+    LS7366& LS7366::operator= (LS7366& rhs);
+    operator long();
+    
+private:
+    SPI _spi;
+    DigitalOut _cs;
+    void _init();
+};
+
+#endif /* LS7366_H */
\ No newline at end of file