Faits: A. En instance de divorce, X._ a été condamné par voie de mesures provisionnelles à verser en mains de son épouse, domiciliée à Pully, une pension mensuelle de 2'000 fr. pour les mois de novembre 2000 à mars 2001 et de 750 fr. dès le 1er avril 2001. Il a payé 11'337 fr. sur les 15'520 fr. dus pour la période écoulée du 1er novembre 2000 au 31 décembre 2001. Il n'a plus rien payé du 1er janvier 2002 au 5 octobre 2006. Le 20 août 2001, son épouse a déposé une plainte, qu'elle a ensuite étendue. B. Par ordonnance du 4 décembre 2003, X._ a été renvoyé devant le Tribunal de police de l'arrondissement de Lausanne, comme accusé de violation d'une obligation d'entretien (art. 217 CP), pour avoir omis de payer la pension alimentaire due à sa famille du 1er novembre 2000 au 31 décembre 2001. Aux débats, le 26 août 2004, l'épouse a étendu sa plainte aux faits survenus du 31 décembre 2001 au 26 août 2004. Passant au jugement, le tribunal de police a condamné X._, pour violation d'une obligation d'entretien du 1er novembre 2000 au 26 août 2004, à deux mois d'emprisonnement avec sursis pendant deux ans. Sur recours du condamné, la Cour de cassation pénale du Tribunal cantonal vaudois a, par arrêt du 21 mars 2005, annulé ce jugement pour violation d'une règle essentielle de la procédure, au motif que le premier juge avait retenu à la charge de l'accusé le non paiement de contributions dues pour une période non mentionnée dans l'ordonnance de renvoi, sans avoir préalablement accompli les formalités prescrites à l'art. 354 du code de procédure pénale vaudois (CPP/VD; RS/VD 312.01). C. Par ordonnance du 7 septembre 2006, X._ a été, sur plainte de l'épouse, renvoyé devant le Tribunal de police de l'arrondissement de Lausanne pour le non paiement des contributions dues de septembre 2004 à septembre 2006. Cette nouvelle procédure a été jointe à la précédente. D. Statuant à nouveau le 5 octobre 2006, le Tribunal de police de l'arrondissement de Lausanne a, derechef sans avoir accompli les formalités prescrites à l'art. 354 CPP/VD, condamné X._, pour violation d'une obligation d'entretien commise sans discontinuer du 1er novembre 2000 au 5 octobre 2006, à trois mois d'emprisonnement avec sursis pendant trois ans, le maintien du sursis étant subordonné à la condition que l'intéressé s'acquitte régulièrement de la contribution d'entretien mise à sa charge par le juge civil. X._ a recouru à nouveau au Tribunal cantonal vaudois, notamment pour violation des art. 353 ss CPP/VD en ce qui concerne sa condamnation pour le non paiement des contributions qui n'étaient pas mentionnées dans les ordonnances de renvoi (soit celles échues du 1er janvier 2002 au 31 août 2004). Par arrêt du 12 mars 2007, la Cour de cassation pénale du Tribunal cantonal vaudois a rejeté ce moyen de nullité comme étant constitutif d'un abus de droit manifeste, confirmé la déclaration de culpabilité et, en application des nouvelles dispositions générales du code pénal, réduit la peine à 90 jours-amende de 30 fr. chacun, avec sursis pendant trois ans, le maintien du sursis étant subordonné à la condition que le condamné s'acquitte régulièrement de la contribution d'entretien mise à sa charge par le juge civil. E. X._ recourt au Tribunal fédéral contre ce dernier arrêt, dont il demande principalement l'annulation avec renvoi de la cause à la cour cantonale, subsidiairement la réforme en ce sens qu'il est acquitté et, plus subsidiairement encore, la réforme en ce sens que la peine est réduite, le montant du jour-amende réduit à 1 fr. et la règle de conduite supprimée. Il se plaint principalement de fausse application du principe de la bonne foi, subsidiairement de fausse application de l'art. 217 CP, plus subsidiairement encore de violation des art. 7 et 12 Cst. et, enfin, de fausse application des art. 34 al. 1 et 2 et 44 al. 2 CP. Il assortit son recours d'une requête d'effet suspensif et d'une demande d'assistance judiciaire. La cour cantonale et la partie civile intimée ont renoncé à se déterminer. Le Ministère public du canton de Vaud conclut au rejet du recours.