hidaka sato / Mbed 2 deprecated 2015_denziben_i2c_S2

Dependencies:   Motor PID mbed

Fork of 2015_denziben_i2c_S by hidaka sato

Committer:
sgrsn
Date:
Thu Sep 03 01:28:32 2015 +0000
Revision:
2:897a1cac8d96
Parent:
0:5af71b978fb7
anal

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kikoaac 0:5af71b978fb7 1 #include "mbed.h"
kikoaac 0:5af71b978fb7 2 #include "Defines.h"
kikoaac 0:5af71b978fb7 3
sgrsn 2:897a1cac8d96 4 BusOut tinko(dp28,dp26,dp24,dp18,dp14,dp13);
sgrsn 2:897a1cac8d96 5 //bit 1 2 3 4 5 6 7 8
sgrsn 2:897a1cac8d96 6 char Registar[0x80]={123}; //128ko 123 ha kinisuruna
kikoaac 0:5af71b978fb7 7 char mode;
kikoaac 0:5af71b978fb7 8 Ticker rotateT;
kikoaac 0:5af71b978fb7 9 Ticker rotateN;
kikoaac 0:5af71b978fb7 10 #include "Registar.h"
kikoaac 0:5af71b978fb7 11
sgrsn 2:897a1cac8d96 12 void action(/*void const *argument*/)
kikoaac 0:5af71b978fb7 13 {
sgrsn 2:897a1cac8d96 14 tinko = short(Registar[Canon]);
kikoaac 0:5af71b978fb7 15 }
kikoaac 0:5af71b978fb7 16 extern "C" void execute_spi_slave_hw( void )
kikoaac 0:5af71b978fb7 17 {
kikoaac 0:5af71b978fb7 18 //ledDbg = 1;
kikoaac 0:5af71b978fb7 19 if(i2c->receive()==I2CSlave::WriteAddressed&&mode==I2C_MODE)
kikoaac 0:5af71b978fb7 20 {
kikoaac 0:5af71b978fb7 21 LED=Red;
kikoaac 0:5af71b978fb7 22 //encoder.stop();
sgrsn 2:897a1cac8d96 23
kikoaac 0:5af71b978fb7 24 //wheel->state(1);
kikoaac 0:5af71b978fb7 25 char DATA[2] = {};
kikoaac 0:5af71b978fb7 26 i2c->read(DATA,2);
kikoaac 0:5af71b978fb7 27 char reg=DATA[0];
kikoaac 0:5af71b978fb7 28 char num =DATA[1];
kikoaac 0:5af71b978fb7 29 char X[num];
kikoaac 0:5af71b978fb7 30 char f=0;
kikoaac 0:5af71b978fb7 31 //wait_us(1000);
kikoaac 0:5af71b978fb7 32 printf("R registar %d ",reg);
kikoaac 0:5af71b978fb7 33 switch(i2c->receive())
kikoaac 0:5af71b978fb7 34 {
kikoaac 0:5af71b978fb7 35 case 0 :break;
kikoaac 0:5af71b978fb7 36 case I2CSlave::ReadAddressed:
kikoaac 0:5af71b978fb7 37 {
kikoaac 0:5af71b978fb7 38 char *po = Registar+reg;
kikoaac 0:5af71b978fb7 39 for(int i=0;i<num;i++)
kikoaac 0:5af71b978fb7 40 X[i]=*po+i;
kikoaac 0:5af71b978fb7 41 i2c->write(X,num);
kikoaac 0:5af71b978fb7 42 f=1;
kikoaac 0:5af71b978fb7 43 do
kikoaac 0:5af71b978fb7 44 {
kikoaac 0:5af71b978fb7 45 f = i2c->write(Registar[reg]);
kikoaac 0:5af71b978fb7 46 // printf(" %d ",Registar[reg]);
kikoaac 0:5af71b978fb7 47 reg++;
kikoaac 0:5af71b978fb7 48 }while(f==1);
kikoaac 0:5af71b978fb7 49 break;
kikoaac 0:5af71b978fb7 50 }
kikoaac 0:5af71b978fb7 51 case I2CSlave::WriteGeneral:{break;}
kikoaac 0:5af71b978fb7 52 case I2CSlave::WriteAddressed:
kikoaac 0:5af71b978fb7 53 {
kikoaac 0:5af71b978fb7 54 char num = DATA[1];
kikoaac 0:5af71b978fb7 55 for(int i=1; i<num; i++,reg++)
kikoaac 0:5af71b978fb7 56 char X[num];
kikoaac 0:5af71b978fb7 57 i2c->read(X,num);
kikoaac 0:5af71b978fb7 58 //Registar[reg]=D;
kikoaac 0:5af71b978fb7 59 for (int i=0;i<num;i++)
kikoaac 0:5af71b978fb7 60 {
kikoaac 0:5af71b978fb7 61 Registar[reg]=X[i];
kikoaac 0:5af71b978fb7 62 // printf("%d ",Registar[reg]);
kikoaac 0:5af71b978fb7 63 reg++;
kikoaac 0:5af71b978fb7 64 }
kikoaac 0:5af71b978fb7 65 //printf(" Registar : %d ,%d\n",Registar[reg],reg);
kikoaac 0:5af71b978fb7 66
kikoaac 0:5af71b978fb7 67 break;
kikoaac 0:5af71b978fb7 68 }
kikoaac 0:5af71b978fb7 69 }
kikoaac 0:5af71b978fb7 70 }
kikoaac 0:5af71b978fb7 71 if(spi->receive()&&mode==SPI_MODE) {
kikoaac 0:5af71b978fb7 72 LED=Blue|Red;
kikoaac 0:5af71b978fb7 73 //wheel.state(1);
kikoaac 0:5af71b978fb7 74 //rotateT.detach();
kikoaac 0:5af71b978fb7 75 //encoder.stop();
kikoaac 0:5af71b978fb7 76 char flag=1;
kikoaac 0:5af71b978fb7 77 char reg = spi->read();
kikoaac 0:5af71b978fb7 78 wait_us(50);
kikoaac 0:5af71b978fb7 79 char num = spi->read();
kikoaac 0:5af71b978fb7 80 //printf("SIZE %d\n",num);
kikoaac 0:5af71b978fb7 81 if(reg&0x80){
kikoaac 0:5af71b978fb7 82 reg=reg&(~0x80);
kikoaac 0:5af71b978fb7 83 flag=0;
kikoaac 0:5af71b978fb7 84 spi->reply(Registar[reg]);
kikoaac 0:5af71b978fb7 85 }
kikoaac 0:5af71b978fb7 86 else spi->reply(0x00);
kikoaac 0:5af71b978fb7 87 //wait_us(10);
kikoaac 0:5af71b978fb7 88
kikoaac 0:5af71b978fb7 89 if(flag)
kikoaac 0:5af71b978fb7 90 for(int i=0;i<num;i++)
kikoaac 0:5af71b978fb7 91 {
kikoaac 0:5af71b978fb7 92 while(!spi->receive());
kikoaac 0:5af71b978fb7 93 wait_us(50);
kikoaac 0:5af71b978fb7 94 Registar[reg+i] = spi->read();
kikoaac 0:5af71b978fb7 95 //printf("%d,%d\n",reg+i,Registar[reg+i]);
kikoaac 0:5af71b978fb7 96 }
kikoaac 0:5af71b978fb7 97 else
kikoaac 0:5af71b978fb7 98 {
kikoaac 0:5af71b978fb7 99 for(int i=0;i<num;i++)
kikoaac 0:5af71b978fb7 100 {
kikoaac 0:5af71b978fb7 101 //
kikoaac 0:5af71b978fb7 102 while(!spi->receive());
kikoaac 0:5af71b978fb7 103 //wait_us(50);
kikoaac 0:5af71b978fb7 104 spi->reply(Registar[reg++]);
kikoaac 0:5af71b978fb7 105 char dummy = spi->read();
kikoaac 0:5af71b978fb7 106 //printf("%d,%d\n",reg+i,Registar[reg+i]);
kikoaac 0:5af71b978fb7 107 }
kikoaac 0:5af71b978fb7 108
kikoaac 0:5af71b978fb7 109 }
kikoaac 0:5af71b978fb7 110 //printf("%d , %d\n",reg,Registar[reg]);
kikoaac 0:5af71b978fb7 111 flag=1;
kikoaac 0:5af71b978fb7 112 //spi->reply(00);
kikoaac 0:5af71b978fb7 113
kikoaac 0:5af71b978fb7 114 //wheel.state(0);
kikoaac 0:5af71b978fb7 115 //encoder.start(10);
kikoaac 0:5af71b978fb7 116
kikoaac 0:5af71b978fb7 117 }
kikoaac 0:5af71b978fb7 118
kikoaac 0:5af71b978fb7 119 }
kikoaac 0:5af71b978fb7 120 int main() {
kikoaac 0:5af71b978fb7 121 //pc.baud(230400);
sgrsn 2:897a1cac8d96 122 LED=0;
sgrsn 2:897a1cac8d96 123 Registar[Who_am_I] = 0x10;
kikoaac 0:5af71b978fb7 124 Mode = new DigitalIn(MODE);
kikoaac 0:5af71b978fb7 125 if(*Mode==1)
kikoaac 0:5af71b978fb7 126 {
kikoaac 0:5af71b978fb7 127 spi = new SPISlave(MOSI, MISO, SCK,SSEL);
kikoaac 0:5af71b978fb7 128 spi->format(8,1);
kikoaac 0:5af71b978fb7 129 spi->frequency(4000000);
kikoaac 0:5af71b978fb7 130 spi->reply(0x00); // Prime SPI with first reply
kikoaac 0:5af71b978fb7 131 mode=SPI_MODE;
kikoaac 0:5af71b978fb7 132 LED=Blue;
kikoaac 0:5af71b978fb7 133 }
kikoaac 0:5af71b978fb7 134 else if(*Mode==0)
kikoaac 0:5af71b978fb7 135 {
kikoaac 0:5af71b978fb7 136 i2c = new I2CSlave(SDA,SCL);
kikoaac 0:5af71b978fb7 137 i2c->frequency(200000);
kikoaac 0:5af71b978fb7 138 //char address[4]={0x20,0xb2,0xee,0xf4};
kikoaac 0:5af71b978fb7 139 Address = new BusIn(I2C_addr_L,I2C_addr_H);
kikoaac 0:5af71b978fb7 140 i2c->address(0xa0/*address[Address->read()]*/);
kikoaac 0:5af71b978fb7 141 mode=I2C_MODE;
kikoaac 0:5af71b978fb7 142 LED=Green;
kikoaac 0:5af71b978fb7 143 delete Address ;
kikoaac 0:5af71b978fb7 144 }
kikoaac 0:5af71b978fb7 145 NVIC_SetVector( I2C_IRQn , ( uint32_t ) execute_spi_slave_hw ) ;
kikoaac 0:5af71b978fb7 146 NVIC_SetPriority( I2C_IRQn , 20 ) ;
kikoaac 0:5af71b978fb7 147 NVIC_EnableIRQ( I2C_IRQn ) ;
kikoaac 0:5af71b978fb7 148
kikoaac 0:5af71b978fb7 149 NVIC_SetPriority(TIMER_16_0_IRQn,9);
kikoaac 0:5af71b978fb7 150 NVIC_SetPriority(TIMER_16_1_IRQn,8);
kikoaac 0:5af71b978fb7 151 NVIC_SetPriority(TIMER_32_0_IRQn,7);
kikoaac 0:5af71b978fb7 152 NVIC_SetPriority(TIMER_32_1_IRQn,6);
sgrsn 2:897a1cac8d96 153 rotateT.attach(&action,0.01);
kikoaac 0:5af71b978fb7 154
kikoaac 0:5af71b978fb7 155 NVIC_SetPriority( EINT0_IRQn , 5 ) ;
kikoaac 0:5af71b978fb7 156 NVIC_SetPriority( EINT1_IRQn , 4 ) ;
kikoaac 0:5af71b978fb7 157 NVIC_SetPriority( EINT2_IRQn , 3 ) ;
kikoaac 0:5af71b978fb7 158 NVIC_SetPriority( EINT3_IRQn , 2 ) ;
sgrsn 2:897a1cac8d96 159 tinko = 0x0000;
kikoaac 0:5af71b978fb7 160 while(1) {
sgrsn 2:897a1cac8d96 161 if(i2c->receive()==I2CSlave::WriteAddressed&&mode==I2C_MODE)
sgrsn 2:897a1cac8d96 162 {
sgrsn 2:897a1cac8d96 163 LED=Red;
sgrsn 2:897a1cac8d96 164 }
sgrsn 2:897a1cac8d96 165 else if(mode==I2C_MODE)
sgrsn 2:897a1cac8d96 166 {
sgrsn 2:897a1cac8d96 167 LED=Green;
sgrsn 2:897a1cac8d96 168 }
sgrsn 2:897a1cac8d96 169 else
sgrsn 2:897a1cac8d96 170 {
sgrsn 2:897a1cac8d96 171 LED=Blue;
sgrsn 2:897a1cac8d96 172 }
kikoaac 0:5af71b978fb7 173 }
sgrsn 2:897a1cac8d96 174 }