基于FPGA的MB核下IIC的中断接收

4 篇文章 0 订阅

1、新建工程,如图所示
在这里插入图片描述
2、生成bit,导入sdk
3、c代码


#include "xparameters.h"
#include "xiic.h"
#include "xintc.h"
#include "xil_exception.h"
#include "xil_printf.h"

#define IIC_DEVICE_ID		XPAR_IIC_0_DEVICE_ID
#define INTC_DEVICE_ID		XPAR_INTC_0_DEVICE_ID
#define IIC_INTR_ID		XPAR_INTC_0_IIC_0_VEC_ID

#define SLAVE_ADDRESS		0x38	/* 0x70 as PC TX ID. */

#define RECEIVE_COUNT		25
#define SEND_COUNT		25


int IicSlaveExample();
int SlaveWriteData(u16 ByteCount);
int SlaveReadData(u8 *BufferPtr, u16 ByteCount);
static int SetupInterruptSystem(XIic * IicInstPtr);
static void StatusHandler(XIic *InstancePtr, int Event);
static void SendHandler(XIic *InstancePtr);
static void ReceiveHandler(XIic *InstancePtr);


XIic IicInstance;
XIntc InterruptController;

u8 WriteBuffer[SEND_COUNT];
u8 ReadBuffer[RECEIVE_COUNT];

volatile u8 TransmitComplete;
volatile u8 ReceiveComplete;

volatile u8 SlaveRead;
volatile u8 SlaveWrite;

int main(void)
{
	int Status;
	XIic_Config *ConfigPtr;	/* Pointer to configuration data */

	ConfigPtr = XIic_LookupConfig(IIC_DEVICE_ID);
	if (ConfigPtr == NULL) {
		return XST_FAILURE;
	}

	Status = XIic_CfgInitialize(&IicInstance, ConfigPtr,ConfigPtr->BaseAddress);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}

	Status = SetupInterruptSystem(&IicInstance);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}

	XIic_SlaveInclude();

	XIic_SetStatusHandler(&IicInstance, &IicInstance, (XIic_StatusHandler) StatusHandler);
	XIic_SetSendHandler(&IicInstance, &IicInstance,	(XIic_Handler) SendHandler);
	XIic_SetRecvHandler(&IicInstance, &IicInstance,	(XIic_Handler) ReceiveHandler);

	Status = XIic_SetAddress(&IicInstance, XII_ADDR_TO_RESPOND_TYPE, SLAVE_ADDRESS);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}

	while(1){
		SlaveReadData(ReadBuffer, RECEIVE_COUNT);
	}
}

int SlaveReadData(u8 *BufferPtr, u16 ByteCount)
{
	int Status;
	ReceiveComplete = 1;
	Status = XIic_Start(&IicInstance);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}
	XIic_IntrGlobalEnable(IicInstance.BaseAddress);

	while ((ReceiveComplete) || (XIic_IsIicBusy(&IicInstance) == TRUE)) {
		if (SlaveRead) {
			XIic_SlaveRecv(&IicInstance, ReadBuffer, RECEIVE_COUNT);
			SlaveRead = 0;
		}
	}

	XIic_IntrGlobalDisable(IicInstance.BaseAddress);

	Status = XIic_Stop(&IicInstance);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}

	return XST_SUCCESS;
}


int SlaveWriteData(u16 ByteCount)
{
	int Status;

	TransmitComplete = 1;

	Status = XIic_Start(&IicInstance);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}

	XIic_IntrGlobalEnable(IicInstance.BaseAddress);

	while ((TransmitComplete) || (XIic_IsIicBusy(&IicInstance) == TRUE)) {
		if (SlaveWrite) {
			XIic_SlaveSend(&IicInstance, WriteBuffer, SEND_COUNT);
			SlaveWrite = 0;
		}
	}

	XIic_IntrGlobalDisable(IicInstance.BaseAddress);

	Status = XIic_Stop(&IicInstance);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}

	return XST_SUCCESS;
}

static void StatusHandler(XIic *InstancePtr, int Event)
{

	if (Event == XII_MASTER_WRITE_EVENT) {
		SlaveRead = 1;
	}
	else {
		SlaveWrite = 1;
	}
}

static void SendHandler(XIic *InstancePtr)
{
	TransmitComplete = 0;
}

static void ReceiveHandler(XIic *InstancePtr)
{
	ReceiveComplete = 0;
}

static int SetupInterruptSystem(XIic * IicInstPtr)
{
	int Status;

	if (InterruptController.IsStarted == XIL_COMPONENT_IS_STARTED) {
		return XST_SUCCESS;
	}

	Status = XIntc_Initialize(&InterruptController, INTC_DEVICE_ID);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}

	Status = XIntc_Connect(&InterruptController, IIC_INTR_ID, (XInterruptHandler) XIic_InterruptHandler, IicInstPtr);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}

	Status = XIntc_Start(&InterruptController, XIN_REAL_MODE);
	if (Status != XST_SUCCESS) {
		return XST_FAILURE;
	}

	XIntc_Enable(&InterruptController, IIC_INTR_ID);
	Xil_ExceptionInit();
	Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler) XIntc_InterruptHandler, &InterruptController);
	Xil_ExceptionEnable();

	return XST_SUCCESS;
}

4、MASTER 发送ID设置为70,每次发送不超过25B,则发送任意长度数据,MICROBLAZE中断接收数据,数据保存在ReadBuffer[RECEIVE_COUNT]中。
5、资源连接https://download.csdn.net/download/sinat_39724439/12804804

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32 IIC(Inter-IC)中断是指当IIC总线上传输数据时,可以使用中断来提醒处理器进行相应的处理。在STM32系列微控制器中,IIC总线也被称为I2C总线。 在使用STM32的IIC中断时,首先需要配置相应的寄存器和中断控制器。可以通过编程的方式设置IIC总线的工作模式、传输速率、地址以及中断使能等。此外,还需要设置相应的GPIO口为IIC功能,并连接到外部设备。 在IIC总线上进行数据传输时,可以通过配置IIC中断,实现数据的接收和发送过程的中断处理。当IIC接收到数据时,中断触发,并且可以在中断处理函数中读取接收到的数据。同样,在发送数据时,也可以配置相应的中断使能,实现数据发送过程的中断处理。 使用IIC中断的好处是可以减少对CPU资源的占用,提高系统的响应速度。当有数据需要传输时,IIC中断会及时提醒处理器,并在中断处理函数中处理相应的操作,而不需要等待或者轮询。这样可以充分利用处理器的时间,进行其他的任务处理。 需要注意的是,在配置和使用IIC中断时,需要仔细检查中断处理函数的编写,确保数据的正确接收和发送,并增加相应的错误处理机制,以保证数据的可靠性和系统的稳定性。 总之,STM32 IIC中断是一种有效的数据传输方式,可以提高系统的响应速度和资源利用率,适用于需要频繁进行数据传输的应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值