⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 alt_2_wire.c

📁 FPGA应用如sd卡控制
💻 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 + -