📄 alt_2_wire.c
字号:
#include <unistd.h>#include <stdio.h>#include "sys/alt_irq.h"#include "system.h"#include "altera_avalon_pio_regs.h"#include "alt_2_wire.h"int alt_2_wireDelay = 3;alt_two_wire* bus;static inline void setupDelay() { int i; for(i = 0; i < alt_2_wireDelay; i++); usleep(1);}static void pulldownSDA() { IOWR_ALTERA_AVALON_PIO_DATA(bus->sda_pio, 0x0); setupDelay();}static void pullupSDA() { IOWR_ALTERA_AVALON_PIO_DATA(bus->sda_pio, 0x1); setupDelay();}static void pulldownSCL() { IOWR_ALTERA_AVALON_PIO_DATA(bus->scl_pio, 0x0); setupDelay();}static void pullupSCL() { IOWR_ALTERA_AVALON_PIO_DATA(bus->scl_pio, 0x1); setupDelay();}static int readSDA() { int read_data = 0; IOWR_ALTERA_AVALON_PIO_DIRECTION(bus->sda_pio, ALTERA_AVALON_PIO_DIRECTION_INPUT); setupDelay(); read_data = (IORD_ALTERA_AVALON_PIO_DATA(bus->sda_pio) & 0x01); IOWR_ALTERA_AVALON_PIO_DIRECTION(bus->sda_pio, ALTERA_AVALON_PIO_DIRECTION_OUTPUT); return read_data;}void alt_2_wireStart() { pullupSCL(); pullupSDA(); pulldownSDA(); pulldownSCL();}void alt_2_wireStop() { pulldownSDA(); pullupSCL(); pullupSDA(); pulldownSCL();}int alt_2_wireSendByte(int byte) { int i, ret; for(i = 7; i > -1; i--) { (byte & (1 << i))?(pullupSDA()):(pulldownSDA()); pullupSCL(); pulldownSCL(); } pullupSDA(); ret = readSDA(); pullupSCL(); pulldownSCL(); return ret;}int alt_2_wireReadByte(int ackControl) { int i, val = 0, ack; pullupSDA(); for(i = 7; i > -1; i--) { pullupSCL(); val |= (readSDA() << i); pulldownSCL(); } switch(ackControl) { case EXPECT_ACK: pullupSCL(); ack = readSDA(); pulldownSCL(); if(ack) return -1; break; case SEND_ACK: pulldownSDA(); pullupSCL(); pulldownSCL(); pullupSDA(); break; case SEND_NACK: pullupSDA(); pullupSCL(); pulldownSCL(); pulldownSDA(); break; default: alt_2_wireStop(); return -1; } return val;}void alt_2_wireSetDelay(int delay) { alt_2_wireDelay = delay;}void alt_2_wireInit(alt_two_wire* wires) { bus = wires; IOWR_ALTERA_AVALON_PIO_DIRECTION(bus->sda_pio, ALTERA_AVALON_PIO_DIRECTION_OUTPUT); IOWR_ALTERA_AVALON_PIO_DIRECTION(bus->scl_pio, ALTERA_AVALON_PIO_DIRECTION_OUTPUT);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -