公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
PingFuQi
Level 3
Level 3
50 sign-ins 10 questions asked 25 sign-ins
 
0 点赞
1 解答
Vison_Zhang
Moderator
Moderator
Moderator
First comment on KBA 750 replies posted 250 sign-ins

你也可以用一下方式去给 EZI2C BUFFER 做赋值操作. 首先 buffer 用 uint16  去定义,然后

miEZI2CBuffer[1]  = CapSense_A1_RX0_BSLN0_VALUE;

miEZI2CBuffer[2]  = CapSense_A1_RX0_DIFF_VALUE;

.... 右侧的宏定义在 CapSense_RegisterMap.h 中可以查找到

在原帖中查看解决方案

0 点赞
19 回复数
YuZh
Moderator
Moderator
Moderator
100 replies posted 10 likes received 50 sign-ins

Hi:

请问你是同时使用CAPSENSE和EZI2C吗?

zhichao

0 点赞
PingFuQi
Level 3
Level 3
50 sign-ins 10 questions asked 25 sign-ins

K

0 点赞
YuZh
Moderator
Moderator
Moderator
100 replies posted 10 likes received 50 sign-ins

Hi:

你试试看,把CAPSENSE部分代码先注释掉,然后在观察EZI2C是否还有类似问题。

zhichao

PingFuQi
Level 3
Level 3
50 sign-ins 10 questions asked 25 sign-ins

B

0 点赞
YuZh
Moderator
Moderator
Moderator
100 replies posted 10 likes received 50 sign-ins

Hi:

如果Buffer[0]不是0x55就不行?其实说到底我是怀疑你CAPSENSE初始化的时候I2C引脚冲突了。

0 点赞
PingFuQi
Level 3
Level 3
50 sign-ins 10 questions asked 25 sign-ins

U

0 点赞
YuZh
Moderator
Moderator
Moderator
100 replies posted 10 likes received 50 sign-ins

Hi:

如果你要结合你的功能来分析的话,需要将你的代码大致每个模块功能详细的描述下,你光给我看你的截图?我不清楚你到底要问什么呀?我都有点迷糊了,尽量一次性把你的信息都说全,这样子大家效率高一点。

你上面这行图,是配置CAPSENSE的图形化界面,有什么问题吗?

 

zhichao

0 点赞
PingFuQi
Level 3
Level 3
50 sign-ins 10 questions asked 25 sign-ins

UUU

0 点赞
YuZh
Moderator
Moderator
Moderator
100 replies posted 10 likes received 50 sign-ins

Hi:

请你详细描述下你的模块各个功能以及要通信的时序吧,我在不了解你的项目背景情况下,看你这个代码有点困难。

谢谢

zhichao

0 点赞
Vison_Zhang
Moderator
Moderator
Moderator
First comment on KBA 750 replies posted 250 sign-ins

EZI2C 的 buffer 值设置多了,sub-address size =  8bit, buffer size 最大只能到 0xFF, 你设置 0xFFF 超出最大寻址范围了。

另外,CapSense 的扫描不是主循环中调用 CapSense_ProcessAllWidget() 和 CapSense_ScanAllWidget() 就可以完成的。请吧这两句改成

CapSense_ScanAllWidget();

while(CapSense_NOT_BUSY != CapSense_IsBusy()); //wait until sensor scan completed 

CapSense_ProcessAllWidget();

0 点赞
PingFuQi
Level 3
Level 3
50 sign-ins 10 questions asked 25 sign-ins

EE

0 点赞
lock attach
Attachments are accessible only for community members.
Vison_Zhang
Moderator
Moderator
Moderator
First comment on KBA 750 replies posted 250 sign-ins

1,CapSense 和 EzI2C 默认是在 CM4 核上运行的,所以对应的中断也默认分配给了 CM4 核。如果要在 CM0p 核上运行它们,你需要先在 Creator 中把对应的中断配置到 CM0p 核上。

Vison_Zhang_0-1676953076451.png

2,你的代码中对 EzI2C 的 buffer 初始化还是不对。对于单个地址的配置(Number of Addresses = 1),你只需要调用 SetBuffer1 函数为 EzI2C 设置 buffer 即可。

//开始执行EZI2C
miEZI2C_Start();
// 定义EZI2C缓存大小, 设置只有第一个字节 buffer[0] 可读写,其余字节只读
miEZI2C_SetBuffer1(miEZI2CBuffer,BUFFER_DATE_SIZE, 1);

3,你的代码中控制 CapSense 初始化以及扫描的控制逻辑有问题,应该改为如下代码。这样在I2C Master 向 EZI2C 写入 “W 08 00 DD P” 之后,CapSense 就可以先完成初始化,然后开始正常扫描。W-Write, 08-EzI2C地址,00-buffer偏移地址,DD-像偏移地址00写入DD, P-Stop

if(miEZI2CBuffer[0] == 0xDD) //开始执行CapSense
{
    CyDelay(50);
    CapSense_InitializeAllBaselines();
    miEZI2CBuffer[0] = 0xAA;
}
if(miEZI2CBuffer[0] == 0xAA)
{ .....}

4,Sensor rawdata/baseline/diff 的数据获取以及向 buffer 中的赋值也有错误。你可以采用一下三个函数来获取这些数据


uint16 GetRaw(uint8 widget)
{
uint16 raw = 0u;

CapSense_FLASH_WD_STRUCT const * ptrFlashWdgt;
ptrFlashWdgt = &CapSense_dsFlash.wdgtArray[widget];
raw = ((CapSense_RAM_SNS_STRUCT *)ptrFlashWdgt->ptr2SnsRam)->raw[0];

return (raw);
}

uint16 GetBaseline(uint8 widget)
{
uint16 bsln = 0u;

CapSense_FLASH_WD_STRUCT const * ptrFlashWdgt;
ptrFlashWdgt = &CapSense_dsFlash.wdgtArray[widget];
bsln = ((CapSense_RAM_SNS_STRUCT *)ptrFlashWdgt->ptr2SnsRam)->bsln[0];

return (bsln);
}

CapSense_THRESHOLD_TYPE GetDiff(uint8 widget)
{
CapSense_THRESHOLD_TYPE diff = 0u;

CapSense_FLASH_WD_STRUCT const * ptrFlashWdgt;
ptrFlashWdgt = &CapSense_dsFlash.wdgtArray[widget];
diff = ((CapSense_RAM_SNS_STRUCT *)ptrFlashWdgt->ptr2SnsRam)->diff;

return (diff);
}

然后利用如下代码将对应数据从 buffer[1] 开始向后逐一存储。

Vison_Zhang_1-1676953785903.png

完整这些修改之后,I2C Master 就可以与 EZI2C 进行通信了。如果你有 Miniprog3/4/KitProg 工具,就可以通过 Bridge Control Panel 直接把数据波形打印出来。

Vison_Zhang_2-1676958278408.png

Vison_Zhang_3-1676958295086.png

 

 

0 点赞
lock attach
Attachments are accessible only for community members.
PingFuQi
Level 3
Level 3
50 sign-ins 10 questions asked 25 sign-ins

Vison_Zhang感谢你的帮助!

按照demo,设置为CM4,问题还是在,还需麻烦你看看,附件为修改后的程序.

 miEZI2CBuffer[0]发送0xDD,就不能读取数据,反回器件读取错误,地址无响应

0 点赞
lock attach
Attachments are accessible only for community members.
Vison_Zhang
Moderator
Moderator
Moderator
First comment on KBA 750 replies posted 250 sign-ins

之前提供的 GetRaw() 等 API 只适用于独立按键(且每个按键配置成一个独立的 Widget),对于 touchpad 类型的 widget,  这种 widget 但一个 widgetID 下会包含多个 sensorID, 获取 raw/base/signal 等数据的方式又发生了很大的变化。

你跑一下我修改后的代码试试?

更简单一点,也可以采用比较笨的方法,直接从 CapSense_RegisterMap.h 中找到相应的对应宏名称,直接调用也可以,但是就没法用 for loop 去做了。

0 点赞
PingFuQi
Level 3
Level 3
50 sign-ins 10 questions asked 25 sign-ins

非常感谢你的帮助,明天可以电话联系一下你吗?

我的电话18819091891

0 点赞
Vison_Zhang
Moderator
Moderator
Moderator
First comment on KBA 750 replies posted 250 sign-ins

你的源码中有两处 大括号错位,我整理代码的时候没有发现,你自己改一下再试试。我用你的工程,对这两处括号做了修改,并且修改了时钟(开发板上没有 EXTCLK)和 EZI2C 的引脚之后,工程是可以跑的,也可以打印数据。

Vison_Zhang_0-1677032468786.png

 

0 点赞
Vison_Zhang
Moderator
Moderator
Moderator
First comment on KBA 750 replies posted 250 sign-ins

你也可以用一下方式去给 EZI2C BUFFER 做赋值操作. 首先 buffer 用 uint16  去定义,然后

miEZI2CBuffer[1]  = CapSense_A1_RX0_BSLN0_VALUE;

miEZI2CBuffer[2]  = CapSense_A1_RX0_DIFF_VALUE;

.... 右侧的宏定义在 CapSense_RegisterMap.h 中可以查找到

0 点赞
PingFuQi
Level 3
Level 3
50 sign-ins 10 questions asked 25 sign-ins

G

0 点赞
Vison_Zhang
Moderator
Moderator
Moderator
First comment on KBA 750 replies posted 250 sign-ins

首先你不需要吧 sub-address 设置成 16bit, 更没有必要把 buffer 的长度设置成 65536, 这样会极大浪费芯片的内存空间。 你需要打印的数据目前不超过 150 bytes,  8-bit address 足够了。

其次代码按如下作修改吧

#include "project.h"

#define BUFFER_DATA_SIZE (75)

uint16 Buffer_DATA[BUFFER_DATA_SIZE];

int main(void)
{
__enable_irq();

miEZI2C_Start(); //开始执行EZI2C
miEZI2C_SetBuffer1((uint8 *)Buffer_DATA,BUFFER_DATA_SIZE,2);//定义EZI2C缓存大小

CapSense_Start();

for(;;)
{
if(Buffer_DATA[0]==0x00DD)
{
CapSense_InitializeAllBaselines();
CyDelay(100);
CapSense_UpdateAllBaselines();
Buffer_DATA[0]=0x00AA;
}

if(Buffer_DATA[0]==0x00AA)
{
CapSense_ScanAllWidgets();
while(CapSense_NOT_BUSY != CapSense_IsBusy())
CapSense_ProcessAllWidgets();
}

if(0 == (miEZI2C_GetActivity() & CY_SCB_EZI2C_STATUS_BUSY))
{
Buffer_DATA[1]=CapSense_A1_RX0_DIFF_VALUE;
Buffer_DATA[2]=CapSense_A1_RX0_BSLN0_VALUE;
Buffer_DATA[3]=CapSense_A2_RX0_DIFF_VALUE;
Buffer_DATA[4]=CapSense_A2_RX0_BSLN0_VALUE;
Buffer_DATA[5]=CapSense_A3_RX0_DIFF_VALUE;
Buffer_DATA[6]=CapSense_A3_RX0_BSLN0_VALUE;
Buffer_DATA[7]=CapSense_A4_RX0_DIFF_VALUE;
Buffer_DATA[8]=CapSense_A4_RX0_BSLN0_VALUE;
Buffer_DATA[9]=CapSense_A5_RX0_DIFF_VALUE;
Buffer_DATA[10]=CapSense_A5_RX0_BSLN0_VALUE;
Buffer_DATA[11]=CapSense_A6_RX0_DIFF_VALUE;
Buffer_DATA[12]=CapSense_A6_RX0_BSLN0_VALUE;

Buffer_DATA[13]=CapSense_T0_RX0_TX0_DIFF_VALUE;
Buffer_DATA[14]=CapSense_T0_RX0_TX0_BSLN0_VALUE;
Buffer_DATA[15]=CapSense_T0_RX0_TX1_DIFF_VALUE;
Buffer_DATA[16]=CapSense_T0_RX0_TX1_BSLN0_VALUE;
Buffer_DATA[17]=CapSense_T0_RX0_TX2_DIFF_VALUE;
Buffer_DATA[18]=CapSense_T0_RX0_TX2_BSLN0_VALUE;
Buffer_DATA[19]=CapSense_T0_RX0_TX3_DIFF_VALUE;
Buffer_DATA[20]=CapSense_T0_RX0_TX3_BSLN0_VALUE;
Buffer_DATA[21]=CapSense_T0_RX0_TX4_DIFF_VALUE;
Buffer_DATA[22]=CapSense_T0_RX0_TX4_BSLN0_VALUE;

Buffer_DATA[23]=CapSense_T0_RX1_TX0_DIFF_VALUE;
Buffer_DATA[24]=CapSense_T0_RX1_TX0_BSLN0_VALUE;
Buffer_DATA[25]=CapSense_T0_RX1_TX1_DIFF_VALUE;
Buffer_DATA[26]=CapSense_T0_RX1_TX1_BSLN0_VALUE;
Buffer_DATA[27]=CapSense_T0_RX1_TX2_DIFF_VALUE;
Buffer_DATA[28]=CapSense_T0_RX1_TX2_BSLN0_VALUE;
Buffer_DATA[29]=CapSense_T0_RX1_TX3_DIFF_VALUE;
Buffer_DATA[30]=CapSense_T0_RX1_TX3_BSLN0_VALUE;
Buffer_DATA[31]=CapSense_T0_RX1_TX4_DIFF_VALUE;
Buffer_DATA[32]=CapSense_T0_RX1_TX4_BSLN0_VALUE;

Buffer_DATA[33]=CapSense_T0_RX2_TX0_DIFF_VALUE;
Buffer_DATA[34]=CapSense_T0_RX2_TX0_BSLN0_VALUE;
Buffer_DATA[35]=CapSense_T0_RX2_TX1_DIFF_VALUE;
Buffer_DATA[36]=CapSense_T0_RX2_TX1_BSLN0_VALUE;
Buffer_DATA[37]=CapSense_T0_RX2_TX2_DIFF_VALUE;
Buffer_DATA[38]=CapSense_T0_RX2_TX2_BSLN0_VALUE;
Buffer_DATA[39]=CapSense_T0_RX2_TX3_DIFF_VALUE;
Buffer_DATA[40]=CapSense_T0_RX2_TX3_BSLN0_VALUE;
Buffer_DATA[41]=CapSense_T0_RX2_TX4_DIFF_VALUE;
Buffer_DATA[42]=CapSense_T0_RX2_TX4_BSLN0_VALUE;

Buffer_DATA[43]=CapSense_T0_RX3_TX0_DIFF_VALUE;
Buffer_DATA[44]=CapSense_T0_RX3_TX0_BSLN0_VALUE;
Buffer_DATA[45]=CapSense_T0_RX3_TX1_DIFF_VALUE;
Buffer_DATA[46]=CapSense_T0_RX3_TX1_BSLN0_VALUE;
Buffer_DATA[47]=CapSense_T0_RX3_TX2_DIFF_VALUE;
Buffer_DATA[48]=CapSense_T0_RX3_TX2_BSLN0_VALUE;
Buffer_DATA[49]=CapSense_T0_RX3_TX3_DIFF_VALUE;
Buffer_DATA[50]=CapSense_T0_RX3_TX3_BSLN0_VALUE;
Buffer_DATA[51]=CapSense_T0_RX3_TX4_DIFF_VALUE;
Buffer_DATA[52]=CapSense_T0_RX3_TX4_BSLN0_VALUE;

Buffer_DATA[53]=CapSense_T0_RX4_TX0_DIFF_VALUE;
Buffer_DATA[54]=CapSense_T0_RX4_TX0_BSLN0_VALUE;
Buffer_DATA[55]=CapSense_T0_RX4_TX1_DIFF_VALUE;
Buffer_DATA[56]=CapSense_T0_RX4_TX1_BSLN0_VALUE;
Buffer_DATA[57]=CapSense_T0_RX4_TX2_DIFF_VALUE;
Buffer_DATA[58]=CapSense_T0_RX4_TX2_BSLN0_VALUE;
Buffer_DATA[59]=CapSense_T0_RX4_TX3_DIFF_VALUE;
Buffer_DATA[60]=CapSense_T0_RX4_TX3_BSLN0_VALUE;
Buffer_DATA[61]=CapSense_T0_RX4_TX4_DIFF_VALUE;
Buffer_DATA[62]=CapSense_T0_RX4_TX4_BSLN0_VALUE;

Buffer_DATA[63]=CapSense_T0_RX5_TX0_DIFF_VALUE;
Buffer_DATA[64]=CapSense_T0_RX5_TX0_BSLN0_VALUE;
Buffer_DATA[65]=CapSense_T0_RX5_TX1_DIFF_VALUE;
Buffer_DATA[66]=CapSense_T0_RX5_TX1_BSLN0_VALUE;
Buffer_DATA[67]=CapSense_T0_RX5_TX2_DIFF_VALUE;
Buffer_DATA[68]=CapSense_T0_RX5_TX2_BSLN0_VALUE;
Buffer_DATA[69]=CapSense_T0_RX5_TX3_DIFF_VALUE;
Buffer_DATA[70]=CapSense_T0_RX5_TX3_BSLN0_VALUE;
Buffer_DATA[71]=CapSense_T0_RX5_TX4_DIFF_VALUE;
Buffer_DATA[72]=CapSense_T0_RX5_TX4_BSLN0_VALUE;
}
}
}

0 点赞