STM32调试笔记:SPI读写TIC12400Q1

一、TIC12400Q1 datasheet相关内容

        1.1读写操作

        SI Bit31是读写操作位,Bit30~Bit25是地址位,Bit24~Bit1是数据位,Bit0是奇偶校验位。

注意:写操作的SO读回来的数据高7位是状态标志位,可以通过标志位来判断数据是否发送成功,SO Bit23~Bit1则是寄存器之前写入的值。

1.2 状态标志位

SPI_FAIL:SPI数据传输标志位。这个标志反映了中断寄存器INT_STAT中的SPI_FAIL位,如果设置为1,则表示(SI)事务中的最后一个SPI 响应器无效。要编写一个完整的字,必须在设备中输入32位信息。SPI逻辑计算时钟进入IC的比特数,并且只有当精确地 32位已经时钟进入时才启用数据锁存。如果字长超过或不满足所需的大小,则中断寄存器INT_STAT的SPI_FAIL 位(将其值镜像到SPI_FAIL状态标志)将被设置为1。这个标志位为1,说明数据格式不对,或者传输过程中数据丢失,注意检查发送数据时CS的状态。

PRTY_FAIL:奇偶校验标志位。这个标志反映了中断寄存器INT_STAT中的PRTY_FAIL位,如果设置为1,则表示(SI)事务中的最后一个SPI 响应器有奇偶校验错误。如果接收到的数据(包括校验位)中“1”的总数为偶数,则丢弃该数据。INT将被置为低,中断寄存器(INT_STAT)中的PRTY_FAIL位被标记为逻辑1。一旦 INT_STAT寄存器被读取,它的内容将在CS的上升沿被清除。PRTY_FAIL状态标志( 镜像INT_STAT寄存器中的PRTY_FAIL位)也将被清除标志位。这个标志的意思就是只要奇偶校验不对,这个标志位就会置为1,并且发过去的数据也会被作废,需要通过读寄存器INT_STAT的操作来清空标志位。(如果不清空标志位,这玩意儿一直都是1,所有的配置都写不进去)

1.3相关寄存器配置

1.3.1 DEVICE_ID Register (Offset = 1h) [Reset = 20h]

        这是一个只读寄存器,用来读取TIC12400的设备ID,可以通过读该寄存器来判断SPI是否正常通讯。这里的Bit23~Bit0对应的是上面写操作的Bit24~Bit1,需要自己加上奇偶校验位。

spi_Read12400Reg(DEVICE_ID, 0x0,0);

运行结果:

        这里的标志位为1不用管,只要不是SPI_FAIL和PRTY_FAIL为1就不会影响数据发送。0x41>>1去掉奇偶校验位就是上述值了。

1.3.2 INT_STAT Register (Offset = 2h) [reset = 1h]

        当事件在设备中发生时,此寄存器记录事件的信息。在此 寄存器上执行的READ命令清除其内容并将寄存器重置为默认值。INT引脚从READ命令在 的CS引脚的上升边被释放。

spi_Read12400Reg(IN_STAT_COMP, 0x0,1);

运行结果:所有标志位置0

1.3.3 CONFIG Register (Offset = 1Ah) [Reset = 0h]

  

        当触发器位设置为逻辑1时,正常的设备操作 (润湿电流激活和轮询)开始。要停止设备操作并使设备处于空闲状态,请将此位解除断言为0。触发设备正常操作后,如果在任何时候需要重新配置设备 设置,则需要微控制器 首先将位TRIGGER设置为逻辑0以停止设备操作。一旦重新配置完成,微控制器可以将 TRIGGER位设置回逻辑1以重新启动设备操作。要注意的是,如果你有需要配置的其他寄存器,需要将CONFIG Register (Offset = 1Ah)的Bit11设置成0才能配置成功,我测得的CONFIG Register默认上电就是Bit11位为1的。配置其他寄存器完成后再将TRIGGER置为1即可正常运行工作了。

 spi_Write12400Reg(CONFIG_REG, 0x0, 0);//TRIGGER设置为0
 spi_Write12400Reg(CONFIG_REG, 0x800, 1);//TRIGGER设置为1

1.3.4 IN_EN Register (Offset = 1Bh) [Reset = 0h]

        通道使能寄存器。要用到哪个通道就需要将对应位设置位1。

spi_Write12400Reg(IN_EN, 0xFFFFFF , 0);

1.3.5 CS_SELECT Register (Offset = 1Ch) [Reset = 0h]

        当前源/汇选择寄存器。我不是很懂这个区别在哪里,我用的比较模式,我不管是设置1还是0结果都是一样的,希望后面有大佬能够帮忙解惑。

1.3.6 Mode Register (Offset = 32h) [Reset = 0h]

   模式选择寄存器。


二、测试代码

       我使用的是STM32F103ZET6开发板,配置TIC12400比较模式,代码可能有误,但是目前能用,还望指正。

uint32_t spi_Write12400Reg(uint8_t addr,uint32_t data, uint32_t PAR)
{
		uint32_t temp, readbuffer = 0;
		uint8_t u;
	
		printf("addr: 0x%xh",(addr));
		addr = WRITE_OP | (addr<<1);
		//printf("   addr: 0x%xh\r\n",(addr));
		temp =  temp | (addr<<24);
	  //printf("temp: 0x%xh\r\n",(temp));
		data = temp | (data<<1) | PAR ;
		
		
		//printf("   data: 0x%xh\r\n",(data));
	
		SPI_CS(1);
		delay_us(1);
		SPI_CS(0);
		delay_us(1);

    readbuffer = spix_read_write_byte((uint8_t)((data)>>24)); 	
    u = spix_read_write_byte((uint8_t)((data)>>16));     readbuffer = (readbuffer<<8) | u	 ;
    u = spix_read_write_byte((uint8_t)((data)>>8));      readbuffer = (readbuffer<<8) | u	 ;
    u = spix_read_write_byte((uint8_t)data);             readbuffer = (readbuffer<<8) | u	 ;
		//readbuffer = (readbuffer<<7 )>>8;
		printf("   spi_Write12400Reg: 0x%xh\r\n",readbuffer);
	
		SPI_CS(1);
		return readbuffer;
}


uint32_t spi_Read12400Reg(uint8_t addr,uint32_t data, uint32_t PAR)
{
		uint32_t temp, q, readbuffer = 0;
		uint8_t u;
	
		printf("addr: 0x%xh",addr);
		addr = READ_OP | (addr<<1);
		//printf("   addr: 0x%xh\r\n",(addr));
		temp =  temp | (addr<<24);
	  q = temp ;
		//printf("temp: 0x%xh\r\n",(temp));
		data = q | (data<<1) |PAR;
		//printf("   data: 0x%xh\r\n",(data));
	
		SPI_CS(1);
		delay_us(1);
		SPI_CS(0);
		delay_us(1);

    readbuffer = spix_read_write_byte((uint8_t)((data)>>24)); 	
    u = spix_read_write_byte((uint8_t)((data)>>16));     readbuffer = (readbuffer<<8) | u	 ;
    u = spix_read_write_byte((uint8_t)((data)>>8));      readbuffer = (readbuffer<<8) | u	 ;
    u = spix_read_write_byte((uint8_t)data);             readbuffer = (readbuffer<<8) | u	 ;
		printf("   spi_Write12400Reg: 0x%xh\r\n",readbuffer);
	
		SPI_CS(1);
		return readbuffer;
}
void spi_ResetTic12400(void)
{

	RESET_PIN(1);
	delay_ms(10);
	RESET_PIN(0);

	spi_initTic12400();
}

void spi_initTic12400(void)
{
			spi_Read12400Reg(0x02, 0x0,0);
		
//	  spi_Write12400Reg(CONFIG_REG, 0x2);
 	 spi_Write12400Reg(CONFIG_REG, 0x0, 0);
//	  spi_Write12400Reg(MODE_SET, 0x0, 0);		
	
//	spi_Write12400Reg(CS_SELECT, 0xFFFFFF, 1 );
//		spi_Write12400Reg(CS_SELECT, 0x000000, 0 );		 	  
	
//		spi_Write12400Reg(THRES_COMP, 0x0, 0);
	  spi_Write12400Reg(IN_EN, 0xFFFFFF , 0);

	
		spi_Write12400Reg(CONFIG_REG, 0x800, 1);

//	  spi_Read12400Reg(0x02, 0x0);
		spi_Read12400Reg(IN_STAT_COMP, 0x0,1);
		spi_Read12400Reg(DEVICE_ID, 0x0,0);
}

uint8_t spi_ReadINC(void)
{
	uint32_t temp;
	temp = spi_Read12400Reg(IN_STAT_COMP, 0x0,1);
	printf("spi_ReadINC: 0x%xh\r\n",temp);
	if( ( (temp&0x40000000) || (temp&0x20000000) ) == 1)
	{
		printf("spi_ReadINC ERROR\r\n");
		return 0;
	}
	else
	{
		printf("spi_ReadINC SUCCESS\r\n");
		return 1;
	}
}
#define Dummy_Byte                                  0xFF
#define WRITE_OP									0x80
#define READ_OP										0x00
#define DEVICE_ID									0x01
#define CONFIG_REG								    0x1A
#define MODE_SET 									0x32
#define THRES_COMP								    0x21
#define CS_SELECT									0x1C
#define IN_EN									    0x1B
#define IN_STAT_COMP                                0x05
														

void spi_ResetTic12400(void);
void spi_initTic12400(void);
uint8_t spi_ReadINC(void);

uint32_t spi_Write12400Reg(uint8_t addr,uint32_t data, uint32_t PAR);
uint32_t spi_Read12400Reg(uint8_t addr,uint32_t data, uint32_t PAR);

三、原理图设计

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值