完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
嘿,伙计们。
我已经成功地把我的ESP32设置为一个主设备,我试图从一个连接到我的PSoC的传感器获得一个值,所以我的PSoC是我的奴隶。当我将代码加载到每个设备时,最初的几次迭代将确实发送IM从PSoC读取到ESP的值,但是从那里我从主服务器的请求函数中没有返回值,并且停止发送信息。 我试着改变EZI2C率,尝试改变IM发送信息的频率,什么也没得到,它一直在发生。 不知道是否有人能给我任何帮助。 电路板-PSOC5LP-059 这是我的主要代码: 虚初始化(空) { CyGloalActuabor;/ /不注释此行以启用全局中断。 UARTHAR11START(); CyDelay(100);/等待开机后的清晰启动 UARTHAR11PUTCRLF(′); UARTHAR1L推杆(“温度传感器Maxm DS18B20:RN”); DS18x811x启动(); ADCJSTART(); //无效I2CySLaveInItRead Buf(Uti8*RDBUF,UITN8 BufSead); //无效I2CySLaveInWruteBuf(UTI8*WRBUF,UTI8BuFiSe); //I2CySLaveEx Sistar(); EZI2CYSET BuffeR1(SiZeof(RDBUF),8,RDBUF); EZI2CYSTART(); TimeDebug TASTEX(ISRY TIMETER); } int() { 初始化(); Chan-TunFravaToTrase[ 4 ]; 旗杆计时器=1;/立即强制测量 浮点风暴读取; 浮法电压读,电流; UIT8I; UIT8活性; (;) { ValueQueRead=CurrTyCurrand(); 电流=(电压×读数-2.5)/电流灵敏度; TimeRead=Read温度();//返回具有温度的浮点 MeMCPY(and TimeLooptoStand,and TimePyRead,SigeOffTalm);/ /将浮点转换成4字节的字符数组 如果(阅读)= -1000){//读取温度是正确的 活动= EZI2CYGETACTIVITY(); 如果((eZi2cGigActuviyYe)和EZi2CyStasuStHuy=0){//只在未被访问时填充缓冲器 UARTHAR11PoStand(“Endoi No,如果**********rn”); 对于(i=0;i & lt;siZeof(TimeLotoToStAR);i++){ RDBUF[I] = TimeLooptoRoad [I]; } } } } } 智能停车器 759字节 以上来自于百度翻译 以下为原文 Hey guys. I've managed to set my ESP32 up as a master device and im trying to get a value from a sensor that is connected to my PSOC, so my psoc is my slave. When I load the code to each device, the first few iterations will indeed send the values im reading from the PSOC to the ESP, but from there on I get no values back from the request function of my master and it stops sending information. I've tried changing the ezi2c rate, tried changing the frequency at which im sending information and got nothing, it keeps happening. Was wondering if anyone can give me any help. Board - PSOC5LP-059 This is my main code: void Initialize(void){ CyGlobalIntEnable; // Uncomment this line to enable global interrupts. UART_1_Start(); CyDelay(100);// waiting for clear start after power on UART_1_PutCRLF(' '); UART_1_PutString("Temperature sensor Maxim DS18B20:rn"); DS18x8_1_Start(); ADC_Start(); //void I2C_SlaveInitReadBuf(uint8 * rdBuf, uint8 bufSize); //void I2C_SlaveInitWriteBuf(uint8 * wrBuf, uint8 bufSize); //I2C_slave_Start(); EZI2C_SetBuffer1(sizeof(rdBuf), 8, rdBuf); EZI2C_Start(); temp_interrupt_StartEx(isr_Timer);}int main(){ Initialize(); char tempFloatToArray[4]; flag_Timer = 1; // force first measument instantly float temp_read; float voltage_read, current; uint8 i; uint8 activity; for(;;) { voltage_read = convert_current(); current = (voltage_read-2.5)/current_sensitivity; temp_read=read_temperature(); // returns a float with the temperature memcpy(&tempFloatToArray, &temp_read, sizeof(tempFloatToArray)); //transforms the float into a char array with 4 bytes if(temp_read != -1000){ //reading of temp was correct activity=EZI2C_GetActivity(); if((EZI2C_GetActivity() & EZI2C_STATUS_BUSY)==0){ //fill the buffer only when it is not being accessed UART_1_PutString("ENTREI NO IF**************rn"); for(i=0;i
|
|
相关推荐
19个回答
|
|
|
|
|
|
谢谢你的帮助。 我只使用那个函数打印UART中的温度值,这样我就可以在TARA术语中看到它们。我相信这是好的,如果他们被删除,一旦功能结束,我只需要他们,同时打印他们在终端上。 不确定我的EZI2C缓冲区出了什么问题,但我再次检查了数据表,并将其改为: 在十进制中定义rdl缓冲区大小(0x10u)// 16 在十进制中定义RWYBuffelyScript(0x0Cu)// 12 UITN8 RDBUF [RDYBuffelySmith]; EZI2C1 SET BuffeR1(RdB缓冲区大小,RWH缓冲区大小,RDBUF); 我的想法是有一个16空间缓冲器,其中12个槽用于读/写,4个是只读的,因为我的主母只请求4字节的信息。我在这里想错了吗?我假设,在数据表中,所有的缓冲区位置的重置都是由函数调用自动完成的……也许我在这里漏掉了一些东西。 以上来自于百度翻译 以下为原文 Thanks for the help bob. I'm only using that function to print the temperature values in the UART so I can see them in the tera term. I believe it's fine if they get deleted once the function ends, I only need them while printing them on the terminal. Not sure about what was wrong with my EZI2C buffer but I went and checked the datasheet again and changed it to this: #define RD_BUFFER_SIZE (0x10u) //16 in decimal #define RW_BUFFER_SIZE (0x0Cu) //12 in decimal uint8 rdBuf[RD_BUFFER_SIZE]; EZI2C_SetBuffer1(RD_BUFFER_SIZE, RW_BUFFER_SIZE, rdBuf); My idea is to have a 16 space buffer where 12 slots are for read/write and 4 are read only, as my master is only requesting 4 bytes of info. Am I thinking wrong here? I'm assuming, by the datasheet, that all the resets to the buffer positions are done automatically by the function calls… Maybe im missing something here. |
|
|
|
周末和失踪的定义可能延迟了答案。;-) 请您发布您的完整PSoC5项目,以便我们都可以查看您的所有设置。为此,使用 创建者-gt;文件& gt;创建工作区束(最小) 并附加生成的文件。 鲍勃 以上来自于百度翻译 以下为原文 Weekend and missing definitions may have delayed an answer. ;-) Can you please post your complete PSoC5 project so that we all can have a look at all of your settings. To do so, use Creator->File->Create Workspace Bundle (minimal) and attach the resulting file. Bob |
|
|
|
asfszczgv 发表于 2018-9-19 15:19 一个错误仍然是一个错误,纠正错误!当一个中断在访问中发生时,结果是不可预知的! “重置缓冲区位置由函数调用自动完成”“不完全”。I2C主机负责正确地处理缓冲器。有关子地址,请参阅数据表中的图片。 鲍勃 以上来自于百度翻译 以下为原文 An error remains an error, correct that bug! When an interrupt fires in the midst of the access the result is pretty unpredictable! "resets to the buffer positions are done automatically by the function calls" Not quite. The I2C master is responsible for addressing the buffer correctly. See pictures in datasheet concerning the sub-address. Bob |
|
|
|
ncmza 发表于 2018-9-19 15:46 根据数据表,寻址是通过设置在写入操作中的第一字节的偏移数据指针来完成的。我不做任何写操作,我的主人只是做读操作。因此,为了发送数据读取请求,我需要首先用偏移数据指针进行写入,这样我就可以开始从那个位置读取数据了吗?是这样吗? 以上来自于百度翻译 以下为原文 According to the datasheet, the addressing is done by setting the offset data pointer which is the first byte in a write operation. I'm not doing any write operation, my master is only doing read operations. So to send a data read request I need to first do a write with the offset data pointer so I can start doing a read from that position on? Is that it? |
|
|
|
asfszczgv 发表于 2018-9-19 15:29 谢谢你的回答,鲍勃! 这个文件附加在这个答案中。 SuffyPARKIN 1.CYWRK.SARVEVE03.ZIP 1.4兆字节 以上来自于百度翻译 以下为原文 Thank you for the answer bob! The file is attached in this answer. |
|
|
|
错误! 在DS18x811GETSaltAutoScript()中,返回指向本地(自动)变量的指针。当函数结束时,变量(在堆栈上分配的)将被重写。 出路:声明TempStr为“静态”或使用它作为全局变量。 在主(TempStr)中检查8×大小的大小 鲍勃 以上来自于百度翻译 以下为原文 Bad error! In DS18x8_1_GetTemperatureAsString() you return a pointer to a local (automatic) variable. When the function ends the variable (which was allocated on the stack) will get overwritten. Way out: Declare TempStr as "static" or use it as a global variable. Check the size of 8 * TempStr against the size of strMsg in main() Bob |
|
|
|
asfszczgv 发表于 2018-9-19 15:51 因此,为了发送数据读取请求,我需要首先用偏移数据指针进行写入,这样我就可以开始从那个位置读取数据了吗?是这样吗?这正是我理解文档的方式。 从数据表: 通常,读取将只包含一个写操作,只有偏移数据指针然后重启。 (或停止/启动),然后读取操作。如果偏移数据指针不需要更新,则为 在重复读取相同数据的情况下,不需要额外的写入操作。 第一。这大大加快了读操作的速度,允许它们彼此直接跟踪。 鲍勃 以上来自于百度翻译 以下为原文 So to send a data read request I need to first do a write with the offset data pointer so I can start doing a read from that position on? Is that it? That's exactly how I understood the documentation. From datasheet: Typically, a read will contain a write operation of only the offset data pointer followed by a restart (or stop/start) and then the read operation. If the offset data pointer does not require update, as in the case of repeatedly reading the same data, no additional write operations are required after the first. This greatly speeds read operations by allowing them to directly follow each other Bob |
|
|
|
asfszczgv 发表于 2018-9-19 16:07 谢谢您。 我把它改为静态的,但是这个函数只能让我看到TARA术语监视器上的温度值,所以在读取正确的时候它并不是真正的问题。 以上来自于百度翻译 以下为原文 Thank you. I changed it to static, but that function is only so I can see the temperature values on the tera term monitor, so it hasn't really been an issue so far as they are being read correctly. |
|
|
|
ncmza 发表于 2018-9-19 16:19 非常感谢,终于奏效了。显然,您需要用随机垃圾填充整个R/W缓冲阵列,因此EZI2C模块认为它是数据指针。只有这样,它才能正确读取读取缓冲区的大小。 非常感谢你的帮助,我真的只是一个白痴在查阅数据表,似乎谁写它希望你通常写和读在同一行动,因此不说任何关于只阅读。 以上来自于百度翻译 以下为原文 Thank you so much, it finally worked. Appearently you need to fill the WHOLE R/W buffer array with random junk so the EZI2C module thinks it's the data pointer. Only then it will be able to read correctly the size of the read buffer. Thank you so much for the help, I was really just being an idiot while consulting the datasheet, it seems like whoever wrote it expects you to usually write AND read on the same action, hence not saying anything about only reading. |
|
|
|
|
|
|
|
你好。
因此,我设法使它工作更多的循环,通过改变拉电阻值到标准4.7K欧姆。通过默认数据速率模式(100K比特率),我可以真实地发送10-15个值,然后问题又回来了,它不再检测到从属响应,并且主不能得到任何结果。 无论如何,我可以深度调试这个吗?到目前为止,我只能打印值,也许如果我能读取时钟和数据线,我将能够确定这个问题。 谢谢。 以上来自于百度翻译 以下为原文 Hello. So I managed to get it working with more loops by changing the pull up resistor value to the standard 4.7k ohm. By having it in default data rate mode (100k bitrate) I can realiably send like 10-15 values and then the problem comes back, it just does not detect the slave response anymore and the master can't get any results. Is there anyway I can debug this in depth? So far I can only print values, maybe if I can read the clock and data lines I will be able to pinpoint the issue. Thanks. |
|
|
|
asfszczgv 发表于 2018-9-19 17:05 请发布实际项目。 鲍勃 以上来自于百度翻译 以下为原文 Please post actual project. Bob |
|
|
|
谢谢你,鲍伯。 在原始帖子中,我用完整的项目附加了zip。 如果需要,我还可以提供我在ESP32主设备上使用的代码。 以上来自于百度翻译 以下为原文 Thank you Bob. In the original post I attached the zip with the full project. If needed I can also provide the code that I am using on the ESP32 master device. |
|
|
|
我知道你在PSoC方面做了一些改变。所以我要求实际的项目。 鲍勃 以上来自于百度翻译 以下为原文 I understood you made a few changes on the PSoC side project. So I asked for actual project. Bob |
|
|
|
我不确定我是否理解。你的意思是在线路板的实际实施的照片吗?还是项目本身而不是整个工作空间? 以上来自于百度翻译 以下为原文 I'm not sure I understand. You mean pictures of the actual implementation in the breadboard? Or the project itself rather than the full workspace? |
|
|
|
对不起,双重语言障碍;-) 我要的是实际的PSoC工作空间。 鲍勃 以上来自于百度翻译 以下为原文 Sorry, double language barrier ;-) I am asking for the actual PSoC workspace. Bob |
|
|
|
我把整个工作空间连接到原来的岗位上。正在进行的项目是“SeSONLS”。 我将重新附加工作空间束档案在这个职位。 谢谢。 Switter 6.2兆字节 以上来自于百度翻译 以下为原文 I attached the whole workspace to the original post. The project that is being worked on is the one called "sensores". I will re-attach the workspace bundle archive in this post. Thanks. |
|
|
|
在DS18x811GETMaultAutoScript()中,仍然返回指针(结果)到本地变量,在返回时将被销毁。 EZI2CYSETBuffeR1()的参数不正确,请参阅数据表。 鲍勃 以上来自于百度翻译 以下为原文 In DS18x8_1_GetTemperatureAsString() you still return a pointer (result) to a local variable which will get destroyed at return. The parameters for EZI2C_SetBuffer1() are not correct, see datasheet. Bob |
|
|
|
只有小组成员才能发言,加入小组>>
747个成员聚集在这个小组
加入小组2046 浏览 1 评论
1794 浏览 1 评论
3604 浏览 1 评论
请问可以直接使用来自FX2LP固件的端点向主机FIFO写入数据吗?
1729 浏览 6 评论
1489 浏览 1 评论
CY8C4025LQI在程序中调用函数,通过示波器观察SCL引脚波形,无法将pin0.4(SCL)下拉是什么原因导致?
448浏览 2评论
CYUSB3065焊接到USB3.0 TYPE-B口的焊接触点就无法使用是什么原因导致的?
314浏览 2评论
CX3连接Camera修改分辨率之后,播放器无法播出camera的画面怎么解决?
387浏览 2评论
332浏览 2评论
使用stm32+cyw43438 wifi驱动whd,WHD驱动固件加载失败的原因?
545浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-10-21 20:33 , Processed in 1.426243 second(s), Total 113, Slave 96 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号