设置为输入引脚

[复制链接]
 楼主| yinxiangh 发表于 2016-4-25 19:39 | 显示全部楼层 |阅读模式
PSoC4的IO口能设置为输入引脚吗?
pangb 发表于 2016-4-25 19:39 | 显示全部楼层
能用IO模拟IIC吗?
chenjunt 发表于 2016-4-25 19:40 | 显示全部楼层
肯定可以啊
ousj 发表于 2016-4-25 19:40 | 显示全部楼层
对啊,IO口几种模式可以选择的
morrisk 发表于 2016-4-25 19:40 | 显示全部楼层
建议lz先看下Pin的数据手册
zyf部长 发表于 2016-4-25 19:40 | 显示全部楼层

可以设置为输入输出
小小猫咪 发表于 2016-4-25 19:41 | 显示全部楼层
为什么要用I/O模拟IIC? PSoC4本身支持I2C
kangzj 发表于 2016-4-25 19:41 | 显示全部楼层
zwll 发表于 2016-4-25 19:42 | 显示全部楼层
当然可以,通过寄存器配置来实现的
chuxh 发表于 2016-4-25 19:42 | 显示全部楼层
可以设置的 能把你的问题再详细一点描述吗
 楼主| yinxiangh 发表于 2016-4-25 19:43 | 显示全部楼层
看到了,多谢大家啊
wangyufeng2500 发表于 2016-4-26 08:34 | 显示全部楼层
PSOC4 模拟IIC读取温湿度传感器代码,自己用的,确保可行,IO口配置为双向口
  1. /*模拟i2c 读取数据*/
  2. void USR_I2C0_init()
  3. {
  4. SCL_1_Write(1);
  5. SDA_1_Write(1);
  6. }
  7. //void USR_I2C1_init()
  8. //{
  9. //        /*34  gpio14 i2c1 scl pin05*/
  10. //        PinTypeGPIO(PIN_05, PIN_MODE_0, false);//GPIO 00
  11. //        PinConfigSet(PIN_05,PIN_STRENGTH_2MA,PIN_TYPE_STD_PU);
  12. //        MAP_GPIODirModeSet(GPIOA1_BASE, 0x40, GPIO_DIR_MODE_OUT);
  13. //        MAP_GPIOPinWrite(GPIOA1_BASE,0x40,0x40);//i2c1 scl
  14. //        /*35  gpio15 i2c1 sda pin06*/
  15. //        PinTypeGPIO(PIN_06, PIN_MODE_0, false);//GPIO 00
  16. //        PinConfigSet(PIN_06,PIN_STRENGTH_2MA,PIN_TYPE_OD_PD);
  17. //        MAP_GPIODirModeSet(GPIOA1_BASE, 0x80, GPIO_DIR_MODE_OUT);
  18. //        MAP_GPIOPinWrite(GPIOA1_BASE,0x80,0x80);//i2c1 scl
  19. //}

  20. #define i2c0_scl_0    (SCL_1_Write(0))//i2c0 scl
  21. #define i2c0_scl_1    (SCL_1_Write(1))//i2c0 scl
  22. #define i2c0_sda_0    (SDA_1_Write(0))//i2c0 scl
  23. #define i2c0_sda_1    (SDA_1_Write(1))//i2c0 scl

  24. #define i2c0_sda_read    (SDA_1_Read())//i2c0 read
  25. #define i2c0_scl_read    (SCL_1_Read())//i2c0 read

  26. #define i2c0_sda_out   (SCL_1_SetDriveMode( SCL_1_DM_STRONG ))//out
  27. #define i2c0_sda_in    (SCL_1_SetDriveMode(SCL_1_DM_RES_UPDWN))//out

  28. #define i2c0_scl_in   (SDA_1_SetDriveMode(SDA_1_DM_RES_UPDWN))//out
  29. #define i2c0_scl_out  (SDA_1_SetDriveMode(SDA_1_DM_STRONG ))//out

  30. //#define i2c1_scl_0    (MAP_GPIOPinWrite(GPIOA1_BASE,0x40,0x00))//i2c0 scl
  31. //#define i2c1_scl_1    (MAP_GPIOPinWrite(GPIOA1_BASE,0x40,0x40))//i2c0 scl
  32. //#define i2c1_sda_0    (MAP_GPIOPinWrite(GPIOA1_BASE,0x80,0x00))//i2c0 scl
  33. //#define i2c1_sda_1    (MAP_GPIOPinWrite(GPIOA1_BASE,0x80,0x80))//i2c0 scl
  34. //
  35. //#define i2c1_sda_read    (GPIOPinRead(GPIOA1_BASE,0x80))//i2c0 read
  36. //#define i2c1_scl_read    (GPIOPinRead(GPIOA1_BASE,0x40))//i2c0 read
  37. //
  38. //#define i2c1_sda_out   (MAP_GPIODirModeSet(GPIOA1_BASE, 0x80, GPIO_DIR_MODE_OUT))//out
  39. //#define i2c1_sda_in   (MAP_GPIODirModeSet(GPIOA1_BASE, 0x80, GPIO_DIR_MODE_IN))//out
  40. //#define i2c1_scl_in   (MAP_GPIODirModeSet(GPIOA1_BASE, 0x40, GPIO_DIR_MODE_IN))//out
  41. //#define i2c1_scl_out   (MAP_GPIODirModeSet(GPIOA1_BASE, 0x40, GPIO_DIR_MODE_OUT))//out

  42. #define i2c_delay        CyDelayUs(4)


  43. ////////////////////////////////////////////////////////////////////usr_i2c0
  44. void USR_I2C0_Start()
  45. {
  46.         i2c0_sda_1;

  47.         i2c0_scl_1;
  48.         i2c_delay;
  49.         // nop();       //起始条件建立时间大于4.7us
  50.         //nop();

  51.         i2c0_sda_0;     //起始条件锁定时间大于4us
  52.         i2c_delay;
  53.         // nop();
  54.         // nop();

  55.         i2c0_scl_0;  //钳住总线准备发数据
  56.         i2c_delay;

  57. }

  58. void USR_I2C0_Stop(void)
  59. {

  60.   i2c0_sda_0;

  61.   i2c0_scl_0;  //发送总线时钟信号
  62.   i2c0_scl_1;  //发送总线时钟信号
  63.   i2c_delay;
  64. // nop();
  65. // nop();       //结束总线时间大于4us

  66.   i2c0_sda_1;    //结束总线
  67.   i2c_delay;
  68. // nop();
  69. // nop();

  70. }

  71. unsigned char USR_I2C0_write_byte(unsigned char data_send)
  72. {
  73.         //scl 默认高电平
  74.         unsigned char i,error=0;

  75.         for(i=0;i<8;i++)
  76.         {
  77.                 if( data_send & 0x80 )
  78.                 {
  79.                         i2c0_sda_1;
  80.                 }
  81.                 else
  82.                 {
  83.                         i2c0_sda_0;
  84.                 }
  85.                 i2c_delay;

  86.                 i2c0_scl_1;
  87.                 i2c_delay;
  88.                 //yanshi
  89.                 i2c0_scl_0;
  90.                 //yanshi

  91.                 i2c_delay;

  92.                 data_send<<=1;

  93.         }

  94.         i2c0_sda_1;

  95.         i2c0_scl_1;


  96.         i2c0_sda_in;
  97.         i2c_delay;

  98.         if(i2c0_sda_read)
  99.         {
  100.                 error = 1;
  101.         }

  102.         i2c0_scl_0;
  103.         i2c_delay;
  104.         i2c0_sda_out;
  105.         return error;

  106. }

  107. unsigned char USR_I2C0_read_byte(unsigned char ack)
  108. {
  109.         //scl 默认高电平
  110.         unsigned char i,data_return=0;
  111.         i2c0_sda_1;
  112.         i2c0_sda_in;
  113.         i2c_delay;

  114.         for(i=0;i<8;i++)
  115.         {
  116.                 data_return<<=1;

  117.                 i2c0_scl_1;
  118.                 i2c_delay;

  119.                 if(i2c0_sda_read)
  120.                 {
  121.                         //UART_PRINT("\r\ni2c byte %02x;\r\n",i2c0_sda_read);
  122.                         data_return |= 0x01;
  123.                 }

  124.                 i2c0_scl_0;
  125.                 //yanshi
  126.                 i2c_delay;
  127.         }

  128.         i2c0_sda_out;
  129.         if(ack)
  130.         {
  131.                 i2c0_sda_0;
  132.         }
  133.         else
  134.         {
  135.                 i2c0_sda_1;
  136.         }
  137.         i2c0_scl_1;
  138.         i2c_delay;
  139.         i2c0_scl_0;
  140.         i2c0_sda_1;
  141.         i2c_delay;


  142.         return data_return;
  143. }

  144. unsigned char SHT_check_crc(unsigned char * data_addr,unsigned char data_num,unsigned char check_crc)
  145. {
  146.         unsigned char crc=0,i,j;
  147.         for(i=0;i<data_num;i++)
  148.         {
  149.                 crc^=*(data_addr+i);
  150.                 for(j=0;j<8;j++)
  151.                 {
  152.                         if(crc&0x80)
  153.                         {
  154.                                 crc=(crc<<1)^0x131;
  155.                         }
  156.                         else
  157.                         {
  158.                                 crc=crc<<1;
  159.                         }
  160.                 }
  161.         }
  162.         if(crc!=check_crc)
  163.         {
  164.                 return 1;
  165.         }
  166.         else
  167.         {
  168.                 return 0;
  169.         }
  170. }

  171. void USR_I2C_read_T_R()
  172. {
  173.         unsigned char error_data=0;
  174.         unsigned char data[20];
  175.     unsigned int  i;
  176.     char buff[20];
  177.         data[0]=0x00;
  178.         data[1]=0x00;
  179.         data[2]=0x00;


  180.         USR_I2C0_init();

  181.         data[0]=0x80;
  182.         data[1]=0xf3;

  183.         USR_I2C0_Start();

  184.         error_data=USR_I2C0_write_byte(data[0]);
  185.         //UART_PRINT("\r\n T W A %d;\r\n",error_data);

  186.         //USR_Test_Ack();
  187.         error_data=USR_I2C0_write_byte(data[1]);
  188.         //USR_Test_Ack();
  189.         //UART_PRINT("\r\n T W B %d;\r\n",error_data);

  190.         data[0]=0x81;

  191.         //i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;
  192.         i=0;
  193.         do
  194.         {
  195.                 USR_I2C0_Start();
  196.                 i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;
  197.                 i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;
  198.                 //USR_I2C0_write_byte(data[0]);
  199.                 i++;
  200.         }while((USR_I2C0_write_byte(data[0])==1)&&(i<2000));

  201.         if(i>=2000)
  202.         {
  203.                 //UART_PRINT("\r\n i2c read t timeout");
  204.         }


  205.         //for(i=0;i<3;i++)
  206.         //{
  207.                 data[0]=USR_I2C0_read_byte(1);

  208.                 data[1]=USR_I2C0_read_byte(1);

  209.                 data[2]=USR_I2C0_read_byte(0);
  210.                 //USR_Test_Ack();
  211.         //}

  212.         USR_I2C0_Stop();

  213.         //if(data[2]==(data[0]+data[1]))
  214.         if(!(SHT_check_crc(data,2,data[2])))
  215.         {
  216.                 t_temp=data[0];
  217.                 t_temp<<=8;
  218.                 t_temp+=data[1];

  219.                 //T=-46.85+175.72*St/65536
  220.                 //T*100=17572*St/65536-4685
  221.                 t_temp=t_temp*17572/65536-4685;
  222.                 t_temp=t_temp/10;//多保留一位小数;

  223.         }
  224.         else
  225.         {
  226.                 t_temp=0;
  227.         }
  228.     sprintf(buff,"\r\ni2c test T %d;\r\n",t_temp);
  229.         UART_UartPutString(buff);
  230.         //UART_PRINT("\r\n i2c read t %02x;%02x;%02x",data[0],data[1],data[2]);
  231.         //////////////////////////////////////////////////////////////////////////////////////////
  232.         data[0]=0x00;
  233.         data[1]=0x00;
  234.         data[2]=0x00;


  235.         USR_I2C0_init();

  236.         data[0]=0x80;
  237.         data[1]=0xf5;

  238.         USR_I2C0_Start();
  239.         error_data=USR_I2C0_write_byte(data[0]);
  240.         //UART_PRINT("\r\n R W A %d;\r\n",error_data);

  241.         //USR_Test_Ack();
  242.         error_data=USR_I2C0_write_byte(data[1]);
  243.         //USR_Test_Ack();
  244.         //UART_PRINT("\r\n R W B %d;\r\n",error_data);

  245.         data[0]=0x81;

  246.         //i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;
  247.         i=0;
  248.         do
  249.         {
  250.                 USR_I2C0_Start();
  251.                 i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;
  252.                 i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;i2c_delay;
  253.                 //USR_I2C0_write_byte(data[0]);
  254.                 i++;
  255.         }while((USR_I2C0_write_byte(data[0])==1)&&(i<2000));

  256.         if(i>=2000)
  257.         {
  258.                 //UART_PRINT("\r\n i2c read R timeout");
  259.         }



  260.         //for(i=0;i<3;i++)
  261.         //{
  262.                 data[0]=USR_I2C0_read_byte(1);

  263.                 data[1]=USR_I2C0_read_byte(1);

  264.                 data[2]=USR_I2C0_read_byte(0);
  265.                 //USR_Test_Ack();
  266.         //}

  267.         USR_I2C0_Stop();

  268.         //if(data[2]==(data[0]+data[1]))
  269.         if(!(SHT_check_crc(data,2,data[2])))
  270.         {
  271.                 r_temp=data[0];
  272.                 r_temp<<=8;
  273.                 r_temp+=data[1];

  274.                 //T=-46.85+175.72*St/65536
  275.                 //T*100=17572*St/65536-4685
  276.                 r_temp=r_temp*1250/65536-60;
  277.                 //r_temp=r_temp/10;//多保留一位小数;

  278.         }
  279.         else
  280.         {
  281.                 r_temp=0;
  282.         }
  283.    
  284.    
  285.         //UART_PRINT("\r\n i2c read rh %02x;%02x;%02x",data[0],data[1],data[2]);
  286.         //UART_PRINT("\r\ni2c test RH %d;\r\n",r_temp);
  287. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

723

主题

7134

帖子

2

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