Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of 2015_denziben_i2c_S by
main.cpp@2:897a1cac8d96, 2015-09-03 (annotated)
- Committer:
- sgrsn
- Date:
- Thu Sep 03 01:28:32 2015 +0000
- Revision:
- 2:897a1cac8d96
- Parent:
- 0:5af71b978fb7
anal
Who changed what in which revision?
| User | Revision | Line number | New 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 | } |
