Part Number: DRV8323R
Other Parts Discussed in Thread: DRV8323
我在CCS21使用28P65系列芯片开发DRV8323RS系列的驱动板,想通过主板的SPI通讯读写驱动芯片内部的所有寄存器,这里只能写入02,03寄存器,但是对于04,05,06就无法进行写入操作,就像是04,我对04寄存器写入0x1B7E,但是实际读取返回的数值是0x0140,无论我写入什么数据一直都是0x0140,明明我03寄存器已经写入解锁操作了
#include "drv8323.h"
//开发板所用引脚
//检测VCC 电源电压 B0
//驱动板使能引脚:GPIO42 1(使能) 0(失能)
//注意:对于GPIO42与TSSA2相连相连,要将SCL_SEL设置为1,才将GPIO42连接到目标芯上,
// 否则无法控制GPIO42
//检测三相电压: A(A14/B14/C14) B(A4) C(B4)
//检测三相电流: A(B7) B(A7) C(C4)
//三相霍尔传感器: A(IO57) B(IO84) C(IO12)
//三相PWM输出操作: A(H:IO8,L:IO9) B(H:IO6,L:IO7) c(H:IO10,L:IO11)
// IDRIVE :C7
// VDS :A0
// POT :C0
//SCLK :IO18/IO72
//MODE :IO14
//SDI :IO16
//SDO :IO17
//nSCS/GAIN:IO23
//CAL :IO133
// //
//SPI数据交换接口:
//base:外设指针
//charLength:数据长度
//pTxBuffer:发送的数据(必须有)==>指针
//pRxBuffer:接收的数据(可以没有, 传输入NULL)==》指针
//numOfWords:传输的数据个数
//txDelay:发送数据延迟(多数据发送 延时)
// SPI_pollingFIFOTransaction(uint32_t base, uint16_t charLength, uint16_t *pTxBuffer, uint16_t *pRxBuffer, uint16_t numOfWords, uint16_t txDelay)
void DRV8323_WriteReg(uint8_t reg_addr, uint16_t reg_data)
{
uint16_t tx_data;
// Bit15=0写,bit14‑11地址,bit10‑0数据
tx_data = DRV8323_BUILD_WR_FRAME(reg_addr, reg_data);
DRV8323_CS_LOW;
SPI_pollingFIFOTransaction(mySPI_DRV8323_BASE,16U,&tx_data,NULL,1,0);
DRV8323_CS_HIGH;
DEVICE_DELAY_US(1);
}
uint16_t DRV8323_ReadReg(uint8_t reg_addr)
{
uint16_t tx_data;
uint16_t rx_data;
// Bit15=1读,bit14‑11地址,低11bit dummy
tx_data = DRV8323_BUILD_RD_FRAME(reg_addr);
DRV8323_CS_LOW;
//DRV8323:读命令帧的那一组 16 个 SCLK 时钟脉冲期间,SDO 线上就同步吐出寄存器返回数据
//参考手册时序图:nSCS 拉低之后,连续输出 16 个 SCLK;
//在这 16 个时钟周期内,主机 SDI 送出读命令帧,同一时刻从器件 SDO 输出寄存器数据;
//16 个时钟结束立刻拉高 nSCS,没有第二组时钟
//发送读命令
SPI_pollingFIFOTransaction(mySPI_DRV8323_BASE,16U,&tx_data,&rx_data,1,0);
DRV8323_CS_HIGH;
DEVICE_DELAY_US(1);
return (rx_data & 0x07FF); // 提取后11位有效数据
}
//驱动板初始化
void DRV8323_Init(void)
{
DRV8323_START;
DSP_Delayms(1); // 等待芯片完全唤醒,手册典型值1ms
read_back = DRV8323_ReadReg(0x00);
printf("Reg 0x00 read:0x%04X\r\n", read_back);
read_back = DRV8323_ReadReg(0x01);
printf("Reg 0x01 read:0x%04X\r\n", read_back);
DRV8323_WriteReg(0x02, 0x0000);
read_back = DRV8323_ReadReg(0x02);
printf("Reg 0x02 Write:0x0000,read:0x%04X\r\n", read_back);
DRV8323_WriteReg(0x03, 0x037E);
read_back = DRV8323_ReadReg(0x03);
printf("Reg 0x03 Write:0x037E,read:0x%04X\r\n", read_back);
DRV8323_WriteReg(0x04, 0x1B7E);
DEVICE_DELAY_US(1000);
read_back = DRV8323_ReadReg(0x04);
printf("Reg 0x04 Write:0x1B7E,read:0x%04X\r\n", read_back);
}