备赛记录第一天——感为八路传感器IIC使用

注:本文记录的原因是方便资料整理和电赛使用,所以有些地方写的可能不是那么清楚,望见谅。

1、使用元器件:感为八路灰度传感器、STM32;

2、配置过程:感为八路灰度传感器每次使用前均需校准,校准方式如下,注意在校准时不要插任何跳线帽。

3、代码编写:

  博主使用的是IIC通信,获取八路传感器的10值,根据资料,传感器的八路10值会被打包成一个char类型8位数据,例如:当八路传感器均为高电平时,输出1111 1111;代码根据江科大IIC例程改编,这里不再赘述:

#include "main.h"
#include "gpio.h"
#define Huidu_Address 0x9E
#define Huidu_Num_Address 0xDD


void Huidu_W_SCL(uint8_t BitValue)
{
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,(GPIO_PinState)BitValue);
	Delay_us(10);
}

void Huidu_W_SDA(uint8_t BitValue)
{
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,(GPIO_PinState)BitValue);
	Delay_us(10);
}

uint8_t Huidu_R_SDA(void)
{
	uint8_t BitValue;
	BitValue =HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_15);
	Delay_us(10);
	return BitValue;
}
void Huidu_Init(void)
{
  MX_GPIO_Init();
		Huidu_W_SCL(1);
Huidu_W_SDA(1);

}
void Huidu_Start(void)
{
Huidu_W_SCL(1);
Huidu_W_SDA(1);
Huidu_W_SDA(0);
Huidu_W_SCL(0);
}
void Huidu_Stop(void)
{
Huidu_W_SCL(0);
Huidu_W_SDA(0);
Huidu_W_SCL(1);
Huidu_W_SDA(1);
}
void Huidu_SendByte(uint8_t Byte)
{
uint8_t i=0;
for(i=0;i<8;i++)
{
Huidu_W_SDA(Byte & (0x80>>i));
Huidu_W_SCL(1);
Huidu_W_SCL(0);
}
}
uint8_t Huidu_ReceiveByte(void)
{
    uint8_t Byte=0x00;
Huidu_W_SDA(1);
uint8_t i=0;
for(i=0;i<8;i++)
{
    Huidu_W_SCL(1);
   if(Huidu_R_SDA()==1)
   Byte|=(0x80>>i);
   Huidu_W_SCL(0);
}
return Byte;
}

uint8_t Huidu_ReceiveAck(void)
{
	uint8_t AckBit;
	Huidu_W_SDA(1);
	Huidu_W_SCL(1);
	AckBit = Huidu_R_SDA();
	Huidu_W_SCL(0);
	return AckBit;
}
void Huidu_SendAck(uint8_t AckBit)
{
Huidu_W_SDA(AckBit);
Huidu_W_SCL(1);
Huidu_W_SCL(0);
}
void Huidu_GetNum_Start(void)
{
	Huidu_Start();
	Huidu_SendByte(Huidu_Address);
	Huidu_ReceiveAck();
	Huidu_SendByte(Huidu_Num_Address);
	Huidu_ReceiveAck();
	Huidu_Stop();
}
char Huidu_GetNum(void)
{
	char GetNum;
	Huidu_Start();
	Huidu_SendByte(Huidu_Address | 0x9F);
	Huidu_ReceiveAck();
	GetNum = Huidu_ReceiveByte();
	Huidu_SendAck(1);
   Huidu_Stop();
return GetNum;
}

有以下三种读取方式:

我选择第二种,并在OLED上显示:

主程序代码:

  Huidu_Init();
 Huidu_GetNum_Start();
  while (1)
  {
		aa=Huidu_GetNum();
	  OLED_ShowSignedNum(2, 1, aa, 8);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

记得初始化

### FPGA中的灰度传感器串行通信HAL实现 对于涉及FPGA的项目,特别是当目标是在嵌入式系统中集成灰度传感器时,采用合适的硬件抽象层(HAL)来管理串行通信接口变得至关重要。通常情况下,在基于ARM架构或其他微控制器单元(MCU)的设计里,HAL库提供了简化外设配置和使用的API函数集合[^1]。 然而针对FPGA环境下的具体应用——即大型在线核方法的大规模高速脉动阵列实现[FPGA Fastfood - A High Speed Systolic Implementation of a Large Scale Online Kernel Method],虽然该研究主要聚焦于机器学习算法加速而非直接处理传感器数据传输问题;但在实际开发过程中,为了使此类复杂计算模块能够接收来自外部设(如灰度摄像头)的数据输入,则同样需要构建有效的通讯机制。 #### 使用UART作为HAL的基础组件 一种常见的做法是以通用异步收发传输器(UART)为核心建立简单的点对点连接方案。通过定义一组标准操作流程,可以创建适用于不同品牌型号灰度图像采集装置的标准驱动程序: - 初始化端口参数设置波特率、停止位数等; - 实现发送/接收缓冲区管理功能; - 提供中断服务例程用于实时响应事件触发。 ```c // UART初始化函数示例 void uart_init(uint32_t baud_rate){ // 配置寄存器... } // 发送单字节数据到Tx FIFO队列 int uart_putc(char c){ while (!(UART_STATUS & TX_READY)); UART_DATA = (uint8_t)c; return 0; } ``` #### SPI/IIC协议的选择及其优势 除了上述提到的UART之外,同步串行外围接口(SPI)或者两线制内部集成电路(I²C)总线也是不错的选择。它们各自具特点适合特定应用场景需求: - **SPI**: 支持全双工模式下更快的数据交换速率,并允许多个从机共用同一组信号线路。 - **I²C**: 占用较少IO资源且易于扩展地址空间以适应多节点网络结构。 无论选用哪种物理层规范,都应确保所选平台支持相应IP核并能方便地调用其底层服务完成高效稳定的双向交互过程。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值