Sony's LANC camera control protocol project.

Dependencies:   aconno_LANC aconno_bsp aconno_SEGGER_RTT

main.cpp

Committer:
jurica238814
Date:
2017-10-30
Revision:
1:3e3dded8192f
Parent:
0:d616ca59aad8
Child:
2:b28027b9c099

File content as of revision 1:3e3dded8192f:

/*
 * Example to demonstrate usage of the nrf52's I2S interface
 *
 * Made by Jurica Resetar @ aconno
 * jurica_resetar@yahoo.com
 * More info @ aconno.de
 *
 * All rights reserved
 *
 */
 
#include "mbed.h"
#include "acd52832_bsp.h"

#define MY_BUF_SIZE     13*8*2      
#define LANC_H      0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF    /* 13 B */
#define LANC_H_L    0xAA, 0xAA, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xAA    /* 13 B */
#define LANC_L      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00    /* 13 B */

/*
 *  Bitovi na I2S bus idu od MSBa do LSBa
 */

#define REC_CMD_1           (0xE7)      // 0xE7  or 0x18
#define REC_CMD_2           (0xCC)      // 0xCC  or 0x33

#define LANC_COMMAND_PIN    (p26)   // Pin connected to Tr to pull lanc bus down/up     2/26
#define LANC_PIN            (p25)   // Lanc bus pin (to scan for START/STOP bits)        3/25

DigitalOut led(p22);
//uint8_t my_tx_buf[MY_BUF_SIZE] = {LANC_H,LANC_L,LANC_L,LANC_H, LANC_H,LANC_L,LANC_L,LANC_L,  LANC_L,LANC_L,LANC_H,LANC_H,LANC_L,LANC_L,LANC_H,LANC_L};
//uint8_t my_tx_buf[MY_BUF_SIZE] = {LANC_H_L,LANC_H_L,LANC_H,LANC_L, LANC_H,LANC_L,LANC_H,LANC_L,  LANC_H,LANC_L,LANC_H,LANC_L,LANC_H,LANC_L,LANC_L,LANC_H_L};
uint8_t my_tx_buf[4] __attribute__ ((aligned (32))) = {0x01, 0x00, 0x00, 0x90};
uint32_t *adrMyTxBuf = (uint32_t*)my_tx_buf;

uint8_t empty_tx_buf[MY_BUF_SIZE] = {LANC_L,LANC_L,LANC_L,LANC_L, LANC_L,LANC_L,LANC_L,LANC_L, LANC_L,LANC_L,LANC_L,LANC_L, LANC_L,LANC_L,LANC_L,LANC_L};
uint8_t my_rx_buf[10] = {};
uint8_t flag = 0;
InterruptIn button(LANC_PIN);


void startLanc(){
        NRF_I2S->EVENTS_TXPTRUPD = 0;
    
        NRF_I2S->ENABLE = 1;
    //NRF_I2S->TXD.PTR = (uint32_t)my_tx_buf;
    
    NRF_I2S->CONFIG.TXEN = 1;       // Enable transmission
    NRF_I2S->TASKS_START = 1;
        //NRF_I2S->TXD.PTR = (uint32_t)my_tx_buf;
    flag = 1;
}

void sendCommand(void){
    //lancTicker.attach_us(startLanc, 10);
    //startLanc();
        NRF_I2S->EVENTS_TXPTRUPD = 0;
        NRF_I2S->ENABLE = 1;
    //NRF_I2S->TXD.PTR = (uint32_t)my_tx_buf;
    
    //NRF_I2S->CONFIG.TXEN = 1;       // Enable transmission
    NRF_I2S->TASKS_START = 1;
        //NRF_I2S->TXD.PTR = (uint32_t)my_tx_buf;
    flag = 1;
}



int main(void){
    led = 1;
    
    NRF_I2S->CONFIG.RXEN = 0;       // Disable reception
    NRF_I2S->CONFIG.MCKEN = 1;      // Enable MCK generator
    
    //NRF_I2S->CONFIG.MCKFREQ = 0x04100000; // DIV 63
    //NRF_I2S->CONFIG.RATIO = 0;        // Ratio = 32x
    NRF_I2S->CONFIG.MCKFREQ = 0x10000000; // DIV 31
    NRF_I2S->CONFIG.RATIO = 0;          // Ratio = 32x
    
    NRF_I2S->CONFIG.SWIDTH = 0;         // Sample width = 8 bit
    NRF_I2S->CONFIG.ALIGN = 0;          // Alignment = Right
    NRF_I2S->CONFIG.FORMAT = 0;         // Format = I2S
    NRF_I2S->CONFIG.CHANNELS = 0;       // Use stereo
    
    
    
    // In debug mode
    NRF_I2S->PSEL.LRCK = 27;                // LRCK routed to pin 26
    NRF_I2S->PSEL.SDOUT = LANC_COMMAND_PIN; // SDOUT routed to pin 28
    NRF_I2S->PSEL.SCK = 30;                 // SCK routed to pin 30
    NRF_I2S->PSEL.MCK = 0x80000000;         // MCK disconnected
    NRF_I2S->PSEL.SDIN = 0x80000000;        // SDIN disconnected
    
    NRF_I2S->TXD.PTR = (uint32_t)adrMyTxBuf;
    //NRF_I2S->RXTXD.MAXCNT = MY_BUF_SIZE/4;  // Div with 4 cuz that's number of 32 bit words
    //NRF_I2S->RXTXD.MAXCNT = 52;
        NRF_I2S->RXTXD.MAXCNT = 1;
        
    //NRF_I2S->ENABLE = 1;
    //NRF_I2S->TASKS_START = 1;
    
    button.fall(sendCommand);
    while(1){
        if(flag){
                        //NRF_I2S->TXD.PTR = (uint32_t)(my_tx_buf);
            led = 0;
            while(!NRF_I2S->EVENTS_TXPTRUPD);    // Wait for the data to be send
            NRF_I2S->EVENTS_TXPTRUPD = 0;
            while(!NRF_I2S->EVENTS_TXPTRUPD);    // Wait for the data to be send
            NRF_I2S->EVENTS_TXPTRUPD = 0;
            //NRF_I2S->TXD.PTR = (uint32_t)empty_tx_buf;
            //wait_us(2000);
            
            //NRF_I2S->TASKS_STOP = 1;
            //while(!NRF_I2S->EVENTS_STOPPED);
            //NRF_I2S->EVENTS_STOPPED = 0;
            NRF_I2S->ENABLE = 0;
            //NRF_I2S->TXD.PTR = (uint32_t)my_tx_buf;
            flag = 0;
            led = 1;
        }
    }   
}