怎样从PSoC 3/5 的 EEPROM 中读取数据?

[复制链接]
 楼主| renyaq 发表于 2018-8-15 14:53 | 显示全部楼层 |阅读模式
怎样从PSoC 3/5 的 EEPROM 中读取数据?
supernan 发表于 2018-8-15 14:56 | 显示全部楼层

好热的天,好大的问题
houcs 发表于 2018-8-15 15:02 | 显示全部楼层
EEPROM处于PSoC3/5内存空间里,EEPROM的最大值容量是2 KB。通过SPC可以写EEPROM,而读EEPROM可以通过PHUB。此外,CPU或DMA都可以直接访问EEPROM数据。EEPROM的存储器的基本指针定义在ydevice.h 的CYDEV_EE_BASE。 该定义通过PHUB可以用来存取EEPROM数据。
 楼主| renyaq 发表于 2018-8-15 15:07 | 显示全部楼层


不要停
yinxiangh 发表于 2018-8-15 15:16 | 显示全部楼层

1.Reading EEPROM using CY_GET_REG8 API
  for (count = 0; count < 255;i++)
    EEPROM_Data[count] = CY_GET_REG8(CYDEV_EE_BASE + count);
pangb 发表于 2018-8-15 15:19 | 显示全部楼层

2.Reading EEPROM using data Pointer                                    
A pointer can be defined for the EEPROM address as follows:
  #define EEPROM_ADDR (unsigned char *) CYDEV_EE_BASE
  for (count = 0; count < 255; i++)
    EEPROM_Data[count] = EEPROM_ADDR[count];  
chenjunt 发表于 2018-8-15 15:25 | 显示全部楼层

3.Reading using DMA
The same base address can be used while reading using DMA.
  MyCh = DMA_DmaInitialize(0,0,0,0);
  MyTd = CyDmaTdAllocate();
  CyDmaTdGetConfiguration(MyTd, 255, DMA_INVALID_TD, (TD_INC_SRC_ADR |    TD_INC_DST_ADR));
  CyDmaTdSetAddress(MyTd, (uint16) CYDEV_EE_BASE, (uint16) EEPROM_Data)
 楼主| renyaq 发表于 2018-8-15 15:28 | 显示全部楼层

唉,还是没有什么结果,算了,先结贴吧,多谢大家啦
supernan 发表于 2018-8-15 15:32 | 显示全部楼层
控制面板程序
juventus9554 发表于 2018-8-15 15:34 | 显示全部楼层
楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因
supernan 发表于 2018-8-15 15:38 | 显示全部楼层
原代码如下:
char       temp[64]     =   " ";
GET_STRING_DESCRIPTOR_IN   input;
pvBuffer   =   malloc   (sizeof   (Usb_String_Descriptor)   +   128);
if   (bOpenDriver   (&hDevice,   pcDriverName)   !=   TRUE)       //   Open   the   driver
{
        显示信息
}
#ifdef   USING_MFC
input.Index   =   (UCHAR)   pTh-> index;
input.LanguageId   =   27;   //   NOTE:   frameworks   ignores   it   anyway
wsprintf   (temp,   "GetStringDescripter:   Index=%d ",   input.Index);
EzSendMessage   (hOutputBox,   LB_ADDSTRING,   0,   (LPARAM)emp);
#endif
//   Get   the   first   bytes   of   the   descriptor   to   determine   the   size   of
//   the   entire   descriptor.
if   (hDevice   !=   NULL)   
{//   Perform   the   Get-Descriptor   IOCTL
        bResult   =   DeviceIoControl   (hDevice,
                    IOCTL_Ezusb_GET_STRING_DESCRIPTOR,
&input,
sizeof   (GET_STRING_DESCRIPTOR_IN),
pvBuffer,
sizeof   (Usb_String_Descriptor),
(unsigned   long   *)&nBytes,
NULL);
}/*   if   valid   driver   handle   */
if   (bResult!=TRUE)   
{//   This   will   happen   with   no   string   defined   
         EzSendMessage   (hOutputBox,   LB_ADDSTRING,   0,   (LPARAM) "Get   String   Descriptor   Failed ");
        //ShowSystemError(hOutputBox);
        CloseHandle   (hDevice);
        free   (pvBuffer);
}/*   if   */
ulLength   =   GET_STRING_DESCRIPTOR_LENGTH(pvBuffer);
assert   (ulLength   > =   0);
//   Now   get   the   entire   descriptor
pvBuffer   =   realloc   (pvBuffer,   ulLength);
if   (pvBuffer)   
{
      //   Perform   the   Get-Descriptor   IOCTL
      bResult   =   DeviceIoControl   (hDevice,
IOCTL_Ezusb_GET_STRING_DESCRIPTOR,
&input,
ulLength,
pvBuffer,
ulLength,
(unsigned   long   *)&nBytes,
NULL);
if   (bResult==TRUE)   
{
      显示信息
}
dingy 发表于 2018-8-15 15:41 | 显示全部楼层
驱动用CB写吗?不少介绍都是用VC+DS,我不懂。
xxrs 发表于 2018-8-15 15:44 | 显示全部楼层

请教一下CB6和DS2.1能配合使用开发WIN2000   和XP的驱动程序吗?
supernan 发表于 2018-8-15 15:47 | 显示全部楼层
说真的我也知道,我是用BCB写应用程序这部分,驱动不是我写的,我们用已经有的,我这个地方很晕,谢谢各位支持
supernan 发表于 2018-8-15 15:51 | 显示全部楼层


typedef   struct   _GET_STRING_DESCRIPTOR_IN
{
      UCHAR         Index;
      USHORT       LanguageId;
}   GET_STRING_DESCRIPTOR_IN,   *PGET_STRING_DESCRIPTOR_IN;
这是驱动里的GET_STRING_DESCRIPTOR_IN结构
yinxiangh 发表于 2018-8-15 16:02 | 显示全部楼层
第一次取字符串实际需要的长度,因为输出的空间不够,所以只返回长度
chenjunt 发表于 2018-8-15 16:04 | 显示全部楼层

发了个信息出去了,第二次按这个长度分配空间,重新读
morrisk 发表于 2018-8-15 16:08 | 显示全部楼层
对,实际上只要分配足够空间,读一次就可以了。
supernan 发表于 2018-8-15 16:11 | 显示全部楼层
多谢,通过提示我好象明白了很多
您需要登录后才可以回帖 登录 | 注册

本版积分规则

700

主题

10138

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部

700

主题

10138

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部