我读取ma736的时候,读0x0000寄存器获取到角度,但是我无法写入信息到芯片这是一个问题。另外,我无论读取哪个寄存器,返回的都是在变化的角度。这两个问题怎么解决呢?
您好,请问你这个读取写入是用的自己的单片机和程序做的,还是用我们的评估套件
单片机自己写的。// 通用 16 位传输
static uint16_t transfer16(const EncoderCfg_t *cfg, uint16_t cmd)
{
cfg → cs_low();
uint8_t hi = cfg → spi_rw(cmd >> 8);
uint8_t lo = cfg → spi_rw(cmd & 0xff);
cfg → cs_high();
return ((uint16_t)hi << 8) | lo;
}
// 写 8 位寄存器
static void write_reg(const EncoderCfg_t *cfg, uint8_t addr, uint8_t val)
{
uint16_t cmd = (0x4 << 13) | ((addr & 0x1f)<< 8) | (val & 0xff);
// 第一帧
cfg → cs_low();
cfg → spi_rw((cmd >> 8) & 0xff);
cfg → spi_rw(cmd & 0xff);
cfg → cs_high();
delay_us(1);
// 第二帧:发送 0x0000 提供时钟并接收确认(忽略返回值)
cfg -> cs_low();
cfg -> spi_rw(0x00);
cfg -> spi_rw(0x00);
cfg -> cs_high();
}
uint8_t buf={};
// 读 8 位寄存器
static uint8_t read_reg(const EncoderCfg_t *cfg, uint8_t addr)
{
uint16_t read_cmd = (0x2 << 13) | ((addr & 0x1f) << 8); // 读命令 010
cfg->cs_low();
cfg->spi_rw((read_cmd >> 8) & 0xff); // 发送高字节,忽略返回
cfg->spi_rw(read_cmd & 0xff); // 发送低字节,忽略返回
cfg->cs_high();
delay_us(5000);
cfg->cs_low();
uint8_t hi = cfg->spi_rw(0x00);
uint8_t reg = cfg->spi_rw(0x00);
cfg->cs_high();
// buf[0] = hi;
// buf[1] = reg;
// UartSendDat(UART5, buf, 2);
return reg;
}
//读角度
uint16_t MaEncoder_ReadAngle(EncoderIndex_t idx)
{
if (idx >= ENC_MAX) return 0;
return transfer16(&enc_cfg[idx], 0x0000);
}
//置零+高阻设置
void MaEncoder_SetZero(EncoderIndex_t idx)
{
uint16_t angle = transfer16(&enc_cfg[idx], 0x0000);
if (idx >= ENC_MAX) return;
write_reg(&enc_cfg[idx], 0x0d, 0x82);//Hiz
//置零
write_reg(&enc_cfg[idx], 0x00, angle & 0xff);
write_reg(&enc_cfg[idx], 0x01, (angle >> 8) & 0xff);
}
这是磁编的驱动。
uint8_t spi1_read_write_byte(uint8_t txdata)
{
uint8_t rxdata;
if (HAL_SPI_TransmitReceive(&g_spi1_handle, &txdata, &rxdata, 1, 1000) != HAL_OK)
{
return 0;
}
return rxdata;
}
这是spi驱动