公告

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

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


void EZI2C_1_Isr(void)
{
Cy_SCB_EZI2C_Interrupt(EZI2C_1_HW, &EZI2C_1_context);
}
#define BUFFER_SIZE (128UL)  Buffer1缓存最大仅是(128UL)吗?

uint8_t buffer[BUFFER_SIZE];

(void) Cy_SCB_EZI2C_Init(EZI2C_1_HW, &EZI2C_1_config, &EZI2C_1_context);

Cy_SysInt_Init(&EZI2C_1_SCB_IRQ_cfg, &EZI2C_1_Isr);
NVIC_EnableIRQ(EZI2C_1_SCB_IRQ_cfg.intrSrc);

Cy_SCB_EZI2C_SetBuffer1(EZI2C_1_HW, buffer, BUFFER_SIZE, BUFFER_SIZE,
&EZI2C_1_context);   Buffer1缓存最大仅是(128UL)吗?

Cy_SCB_EZI2C_Enable(EZI2C_1_HW);

0 点赞
1 解答
Vison_Zhang
Moderator
Moderator
Moderator
750 replies posted 250 sign-ins 250 solutions authored

Sub-address Size 配置 8bit 的话,EzI2C 可以寻址的 offset 地址范围是 0-255,也就是你说的缓存最大设定值是 256 bytes。Sub-address Size 配置 16bit 的话,EzI2C 可以寻址的 offset 地址范围是 0-65536,缓存最大设定值是 65536 bytes。

在原帖中查看解决方案

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

Hi:

你可以看下SetBuffer1源代码,这个buffer的大小是是你自己认为可以定义的,并且你个得了多少,会有专门的结构体记录下你的大小类型,然后在之后的发送接口或者接受接口进行判断。类型是uint32_t类型的,也就是你只要不超过这个大小,应该就是没问题的。

 

zhichao

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

#include "project.h"

#define cust_tuner 0 // 注释1为手动调试,注释0为自动测试


#define BUFFER2_SIZE (0xFF)
#define BUFFER_SIZE (0xFFF)

uint8 Buffer[BUFFER_SIZE];
uint16 tempdiff;
uint16 tempbsln;
uint16 temp;


int main(void)
{
__enable_irq();

Cy_SysLib_Delay(100);

miEZI2C_Start();

miEZI2C_SetBuffer1(Buffer,BUFFER_SIZE,BUFFER_SIZE);

#if cust_tuner

I2C_Start();
I2C_SetBuffer1((uint8_t *)&CapSense_dsRam,
sizeof(CapSense_dsRam),
sizeof(CapSense_dsRam));
CapSense_Start();
CapSense_ScanAllWidgets();


for(;;)
{
if(CapSense_NOT_BUSY == CapSense_IsBusy())
{
if(!Cy_GPIO_Read(Init_B_PORT,Init_B_NUM))
{
CyDelay(100);
if(Cy_GPIO_Read(Init_B_PORT,Init_B_NUM)==0)
{
CapSense_InitializeAllBaselines();
}
}
CapSense_ProcessAllWidgets();

CapSense_RunTuner();

CapSense_ScanAllWidgets();
}
}
#else

for(;;)
{ CyDelay(130);
if(Buffer[00]==0xDD)
{
CapSense_Start();
CyDelay(200);
//CapSense_InitializeAllBaselines();

//CyDelay(50);
Buffer[00]=0xAA;
}


CapSense_ProcessAllWidgets();
CapSense_ScanAllWidgets();
CapSense_RAM_SNS_LIST_STRUCT *mySnsTmpList;
CapSense_RAM_SNS_STRUCT *mySnsTmp;
mySnsTmpList = &CapSense_dsRam.snsList;
mySnsTmp = mySnsTmpList->a1;
if(Buffer[00]==0xAA)
{
uint8 j=0;

for(uint8 i=0;i<CapSense_TOTAL_CSD_SENSORS+CapSense_TOTAL_CSX_NODES;i++)
{
j=1;
tempdiff = mySnsTmp -> diff;
tempbsln = mySnsTmp -> bsln[0];
Buffer[i*4+j]=(uint8)((tempdiff>>8)&0xFF);
j++;
Buffer[i*4+j]=(uint8)(tempdiff & 0xFFF);
j++;
Buffer[i*4+j]=(uint8)((tempbsln>>8)&0xFF);
j++;
Buffer[i*4+j]=(uint8)(tempbsln & 0xFF);
mySnsTmp++;
}

}
if(Buffer[00]==0x55)
{
CapSense_Stop();

Cy_SysLib_ClearFlashCacheAndBuffer();

}
}
#endif
}

0 点赞
Vison_Zhang
Moderator
Moderator
Moderator
750 replies posted 250 sign-ins 250 solutions authored

Sub-address Size 配置 8bit 的话,EzI2C 可以寻址的 offset 地址范围是 0-255,也就是你说的缓存最大设定值是 256 bytes。Sub-address Size 配置 16bit 的话,EzI2C 可以寻址的 offset 地址范围是 0-65536,缓存最大设定值是 65536 bytes。

0 点赞
lock attach
Attachments are accessible only for community members.
YuZh
Moderator
Moderator
Moderator
100 replies posted 10 likes received 50 sign-ins

Hi:

抱歉由于我对这个模块不熟悉,导致有些误导,就如上面我同事所说的,然后我给你一份文档里面有详细描述EZI2C的一些细节。

EZI2C.PNG

抱歉哈。

zhichao

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

感谢!

8bit地址是 0xFF

16bit地址是的 0xFFFF

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

buffer如何清零?

0 点赞
Vison_Zhang
Moderator
Moderator
Moderator
750 replies posted 250 sign-ins 250 solutions authored

如果是统一清零,最快的方法是使用 memset() 将数组对应的这一段内存。如果是 I2C Master 对特定的地址进行清零,那么需要按照一下格式:

 Write Slave_addr OffsetAddrLsb8 OffsetAddrMsb8 00 00 Stop,  比如要清楚 uing16 ezi2cbuffer[2] 的两个 byte 的内容,Master 发送数据的顺序是: Start  08(+write bit)    04 00     00 00  Stop,  其中 08 是save 地址, 04 00 是 ezi2cbuffer[2] 的 offset 地址, 00 00 是清零数据

无论 exi2cbuffer[] 是定义成 uint8 还是 uint16 类型, EZI2C 都会吧 buffer 识别成一个 uint8 类型定义的 buffer, 所以 uint16 exi2cbuffer[0] 在 ezi2c 看来是占用了 00 和 01 两个偏移地址,  uint16 exi2cbuffer[2] 则占用了 04 和 05 两个偏移地址。

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

MCU内部统一清除buffer,

如何定义一个数组[00]赋给buffer

0 点赞
Vison_Zhang
Moderator
Moderator
Moderator
750 replies posted 250 sign-ins 250 solutions authored

Master 像 EZI2C 写入“地址+写位” 以及 offset 地址之后,继续写入多个数据的话,ezi2c 将数据以 offset address 为基地址,自动做地址+1操作。比如你想清楚 ezi2cbuffer[2] 和 ezi2cbuffer[3] 就可以写 Start  08(+write bit)    04 00     00 00    00 00 Stop,  这四个 00 就会从 04 偏移地址开始, 一直写到 07, 每一个 byte 都写入 00.

 

EZI2C 组件右击选择 open datasheet 可以查看详细的手册,建议你先读一下。

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

我想在这个条件执行赋0动作

if(Buffer_DATA[0]==0x55)

{

int Buffer_DATA[0xFF]={0};

}

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

初始化miEZI2C是这样写吗?
if(Buffer_DATA[0]==0x55)

cy_en_scb_ezi2c_status_t miEZI2C_Init(cy_stc_scb_ezi2c_config_t const *config);

miEZI2C_Enable();

0 点赞
Vison_Zhang
Moderator
Moderator
Moderator
750 replies posted 250 sign-ins 250 solutions authored

右击 miEZI2C_Start();//开始执行EZI2C 代码,选择 go to definition 就可以跳转到该函数体内,拷贝这个函数的内容,吧 miEZI2C_initVar if 语句的条件去掉,就是一个完整的初始化代码。

0 点赞