前段时间研究了 GPIO扩展芯片XRA1402/XRA1403/XRA1404/XRA1405系列
这个系列芯片可以通过SPI 扩展 通用GPIO, 1402为8位扩展,1403为16为扩展
官方只有数据手册,没有任何范例,其实挺简单的控制时序,自己却研究了一个星期,原因是有一句关键的话没有在意:
以前写的程序在写入寄存器后,没有将CLK拉低,所以怎么处理都不行。
以下为对数据手册的简单翻译,希望可以帮助其他使用该系列芯片的朋友。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
命令字节表示将被访问的寄存器的地址偏移量 在最后一次读或写事务之后,SPI主控制器将SCL信号设置回其空闲状态(LOW) 命令字节 寄存器描述 读/写 默认数值 0x00 000 0 000 0 0x00 GSR -GPIO状态 只读 0xXX 0x01 000 0 001 0 0x02 OCR – 输出控制 读/写 0xff 0x02 000 0 010 0 0x04 PIR -输入极性反转 读/写 0x00 0x03 000 0 011 0 0x06 GCR- GPIO 组态/构造 读/写 0xFF 0x04 000 0 100 0 0x08 PUR-输入内部上拉电阻启用/禁用 读/写 0x00 0x05 000 0 101 0 0x0A IER-输入中断使能 读/写 0x00 0x06 000 0 110 0 0x0C TSCR - 输出三态控制 读/写 0x00 0x07 000 0 111 0 0x0E ISR -输入中断状态 读 0x00 0x08 000 1 000 0 0x10 REIR - 输入上升沿中断使能 读/写 0x00 0x09 000 1 001 0 0x12 FEIR - 输入下降沿中断使能 读/写 0x00 0x0A 000 1 010 0 0x14 IFR - 输入滤波器启用/禁用 读/写 0xFF 0x00 GSR GPIO状态 可以通过该寄存器读取P7 - P0的状态。 读操作将显示这些引脚的当前状态(如果通过PIR寄存器使能,则显示这些引脚的反转状态)。 读取该寄存器将清除输入中断。 对于任何配置为输出的引脚,读取该寄存器也将返回写入OCR寄存器的最后一个值(即,这与实际输出引脚的状态不同,因为输出引脚可以处于三态模式)。 写入该寄存器无效。 该寄存器的MSB与P7对应,该寄存器的LSB与P0对应 0x01 OCR 输出控制 当P7 - P0定义为输出时,可以通过写入该寄存器来控制它们。 读取该寄存器将返回写入的最后一个值,但是,该值可能不是输出引脚的实际状态,因为这些引脚可以处于三态模式。 该寄存器的MSB与P7对应,该寄存器的LSB与P0对应 0x02 PIR-输入极性反转 1为输入翻转 0为实际输入 当P7 - P0定义为输入时,该寄存器会反转从输入端口寄存器读取的输入值的极性。 如果该寄存器中的相应位设置为1,则GSR寄存器中该位的值将是输入引脚的反相值。 如果该寄存器中的相应位设置为0,则GSR寄存器中该位的值将是输入引脚的实际值。 该寄存器的MSB与P7对应,该寄存器的LSB与P0对应。 0x03 GCR-GPIO 组态/构造 0为输出 1为输入 该寄存器将GPIO配置为输入或输出。 上电和复位后,GPIO是输入。 将这些位设置为0将使GPIO成为输出。 将这些位设置为1将使GPIO成为输入。 该寄存器的MSB与P7对应,该寄存器的LSB与P0对应。 0x04 PUR-输入内部上拉电阻启用/禁用 1启用内部上拉 “0”将禁用 该寄存器使能/禁止输入的内部上拉电阻。 上电和复位后,XRA1402的内部上拉电阻被禁用。 向这些位写入1将使能内部上拉电阻。 向这些位写入“0”将禁用内部上拉电阻。 该寄存器的MSB与P7对应,该寄存器的LSB与P0对应。 IER -输入中断使能 1使能该引脚中断 0为 该寄存器启用/禁用输入的中断。 上电和复位后,中断被禁用。 向这些位写入1将使能相应输入引脚的中断。当GCR位为0时,输出不产生中断。该寄存器的MSB对应P7,该寄存器的LSB对应P0 TSCR - 输出三态控 该寄存器可以启用/禁用输出的三态模式。 向这些位写入1将启用相应输出引脚的三态模式。 ISR - 输入中断状态 该寄存器报告产生中断的输入引脚。 REIR - 输入上升沿中断使能 向这些位写入1将使相应的输入在上升沿产生中断。 FEIR - 输入下降沿中断使能 向这些位写入1将使相应的输入在下降沿产生中断。 IFR - 输入滤波器启用/禁用 一般为默认 默认情况下,输入过滤器已启用(IFR =0xFF)。 当输入滤波器使能时,任何大于1075ns的脉冲都将产生中断(如果使能)。 小于225ns的脉冲将被滤波,不会产生中断。在此范围之间的脉冲可能会也可能不会产生中断。 向这些位写入“0”将禁用相应输入的输入滤波器。 禁用输入滤波器后,输入上的任何更改都将产生中断(如果已启用)。 0x06 配置GPIO组态(输入/输出) 0x00 使所有IO为输出引脚//0xF0 高4位为输入,第四位为输出 0x02 输出控制 0x00 使所有IO为 0 电平 / 0xFF所有IO口为高电平 0x06配置GPIO组态(输入/输出) 0x14 (0001 0100)使第4位、第2位为输入,其他为输出 0x04 输入极性相反 0x04 使第2位输入数据反相(取 非 ) 0x00 读GPIO状态 0x04 读第2位IO口的数据 - void XRA1402_int(void) //初始化函数,将所有IO设置为输出,并且为低电平
- {
- CS=0;
- Write_Data((GCR<<1) & 0x7E); //等同于Write_Data(0x06);
- ////////////////////////////////写寄存器时候要注意地址向左移一位才行
- Write_Data(0x00); //GCR寄存器写0x00,设置所有IO口为输出
- VFD_SCK = 0; //写完毕后,必须拉低
- CS=1;
- CS=0;
- Write_Data((OCR<<1) & 0x7E); //等同于 Write_Data(0x02);
- Write_Data(0x00); //OCR寄存器写0x00,设置所有IO口为输出—低电平
- VFD_SCK = 0; //写完毕后,必须拉低
- CS=1;
- }
复制代码
|