void start() { //Colocar SCL e SDA activos GPIO_Set(SDA|SCL); wait(); //Provoca a transicao descendente a SDA para dar a Sequencia de START GPIO_Clr(SDA); wait(); //baixa o SCL para ficarem ambos iguais GPIO_Clr(SCL); }
void giveClk() { wait(); GPIO_Set(SCL); wait(); GPIO_Clr(SCL); }
void stop() { GPIO_Clr(SDA|SCL); wait(); GPIO_Set(SDA); wait(); }
readByte(char *byte, int lastbyte) { int idx; *byte = 0x0; for(idx=7 ; idx >= 0 ; --idx) { GPIO_Set(SDA); wait(); GPIO_Set(SCL); wait(); char cs = (GPIO_Read()&SDA)>>SDA_OFFSET; char myByte = ((GPIO_Read()&SDA)>>SDA_OFFSET)<<idx; *byte |= ((GPIO_Read()&SDA)>>SDA_OFFSET)<<idx; GPIO_Clr(SCL); } if(lastbyte == 1) GPIO_Set(SDA);//NACK else GPIO_Clr(SDA);//ACK giveClk(); }
int main() { GPIO_Init(0x0001); while(1) { int i; GPIO_Set(0x0001); for(i = 0; i < 1024 *2; ++i); GPIO_Clr(0x0001); for(i = 0; i < 1024 *2; ++i); } }
unsigned int writeByte(char *byte) { int idx, count; count = 0; do{ for(idx=7 ; idx >= 0 ; idx--) { int c = ((*byte)>>idx)&0x1; if(c==1) GPIO_Set(SDA); else GPIO_Clr(SDA); giveClk(); } giveClk(); ++count; }while((count <= MAX_SEND) &&(GPIO_Read()&SDA == 0)); //Verifica se ainda é NACK, enquanto for tenta enviar os dados //if(GPIO_Read()&SDA != 0) return 1; //Faz read ao ACK que vem do dispositivo para garantir que recebeu bem os dados if(count > MAX_SEND) return -1; return 1; }
void GPIO_WriteMask(unsigned int maskbit, unsigned int value) { GPIO_Clr(maskbit); GPIO_Set(value); }
void GPIO_Write(unsigned int value) { GPIO_Clr(0xFFFF); GPIO_Set(value); }
int main(void) { int32_t i32Err; sysDisableCache(); sysFlushCache(I_D_CACHE); sysEnableCache(CACHE_WRITE_BACK); sysInitializeUART(); sysprintf("+-------------------------------------------------+\n"); sysprintf("| GPIO Sample Code |\n"); sysprintf("+-------------------------------------------------+\n\n"); /* Configure Port C to input mode and pull-up */ GPIO_Open(GPIOC, DIR_INPUT, PULL_UP); /* Set Port C output data to 0xFFF */ GPIO_Set(GPIOC, 0xFFF); /* Set Port C output data to 0x000 */ GPIO_Clr(GPIOC, 0xFFF); /* Configure Port C to default value */ GPIO_Close(GPIOC); i32Err = 0; sysprintf("GPIO PD.3(output mode) connect to PD.4(input mode) ......"); /* Configure PD3 to output mode */ GPIO_OpenBit(GPIOD, BIT3, DIR_OUTPUT, NO_PULL_UP); /* Configure PD4 to output mode */ GPIO_OpenBit(GPIOD, BIT4, DIR_INPUT, NO_PULL_UP); /* Use Pin Data Input/Output Control to pull specified I/O or get I/O pin status */ /* Pull PD.3 to High and check PD.4 status */ GPIO_SetBit(GPIOD, BIT3); if(GPIO_ReadBit(GPIOD,BIT4)==0) i32Err = 1; /* Pull PD.3 to Low and check PD.4 status */ GPIO_ClrBit(GPIOD, BIT3); if(GPIO_ReadBit(GPIOD,BIT4)==1) i32Err = 1; if(i32Err) { sysprintf(" [FAIL].\n"); } else { sysprintf(" [OK].\n"); } /* Configure PD3 to default value */ GPIO_CloseBit(GPIOD, BIT3); /* Configure PD4 to default value */ GPIO_CloseBit(GPIOD, BIT3); /* Set MFP_GPF11 to EINT0 */ outpw(REG_SYS_GPF_MFPH,(inpw(REG_SYS_GPF_MFPH) & ~(0xF<<12)) | (0xF<<12)); /* Configure PF11 to input mode and pull-up */ GPIO_OpenBit(GPIOF, BIT11, DIR_INPUT, PULL_UP); /* Confingure PF11 to rising-edge trigger */ GPIO_EnableTriggerType(GPIOF, BIT11,RISING); /* Enable external 0 interrupt */ GPIO_EnableEINT(NIRQ0, (GPIO_CALLBACK)EINT0Callback, 0); /* waiting for external 0 interrupt */ sysprintf("waiting for PF11 rsing-edge trigger..."); while(!eint_complete); /* Disable PF11 trigger type */ GPIO_DisableTriggerType(GPIOF, BIT11); /* Enable external 0 interrupt */ GPIO_DisableEINT(NIRQ0); sysprintf(" [OK].\n"); /* Configure PF11 to default value */ GPIO_CloseBit(GPIOF, BIT11); /* Configure PE3 to output mode */ GPIO_OpenBit(GPIOE, BIT3, DIR_INPUT, NO_PULL_UP); /* Confingure PE3 to falling-edge trigger */ GPIO_EnableTriggerType(GPIOE, BIT3,FALLING); /* Enable GPIOE interrupt */ GPIO_EnableInt(GPIOE, (GPIO_CALLBACK)GPIOECallback, 0); /* waiting for external 0 interrupt */ sysprintf("waiting for PE3 falling-edge trigger..."); while(!gpio_complete); /* Disable PE3 to trigger type */ GPIO_DisableTriggerType(GPIOE, BIT3); /* Disable GPIOE interrupt */ GPIO_DisableInt(GPIOE); /* Configure PE0 to default value */ GPIO_CloseBit(GPIOE, BIT3); sysprintf(" [OK].\n"); while(1); }